Я пытаюсь создать приложение, которое требует, чтобы я часто отправлял записанные данные в базу данных Firebase. Когда сеть отключается или батарея вот-вот разрядится, я сохраняю все данные, которые не были сохранены в firebase локально. Однако для этого мне требуется около 20 МБ данных (у меня довольно большие данные). При этом я хочу найти способ проверить доступное хранилище (и, если возможно, батарею), чтобы предупредить пользователя. Возможно ли это с помощью Xamarin Forms? Кроме того, есть ли способ сделать это решение универсальным (т.е. мне не нужен отдельный фрагмент кода для iOS и Android)? (Я новичок в Xamarin и С#)
Что вы имеете в виду под этим? Я пытаюсь найти доступное место на устройстве, на котором запущено приложение.
@ШирамА. ты видел мой ответ?
Используйте следующий код, чтобы проверить свободный размер устройства:
Для iOS:
NSFileManager.DefaultManager.GetFileSystemAttributes (Environment.GetFolderPath (Environment.SpecialFolder.Personal)).FreeSize;
Для Android:
var freeExternalStorage = Android.OS.Environment.ExternalStorageDirectory.UsableSpace;
Универсального варианта нет, но вы можете обернуть его таким интерфейсом и реализовать в каждом проекте:
public interface IStorage
{
double GetRemainingStorage();
}
Было бы здорово, если бы подобную функцию можно было добавить в Xamarin.Essentials — на GitHub был запрос, но он так и не был выполнен.
Если будут проблемы с кодом - сообщите.
Надеюсь, это помогло,
инструкции
Создайте интерфейс в своем общем проекте под названием IStorage
.
В вашем Android-проекте создайте класс под названием AndroidStorageManager
(вы можете назвать его как хотите). Сделайте так, чтобы он расширялся IStorage
. Метод GetRemainingStorage()
должен иметь возвращаемый тип double
.
public class AndroidStorageManager : IStorage
{
public double GetRemainingStorage()
{
var freeExternalStorage = Android.OS.Environment.ExternalStorageDirectory.UsableSpace;
return freeExternalStorage;
}
}
Для iOS
Создайте класс в своем проекте iOS под названием iOSStorageManager
, который расширяет IStorage
:
public class iOSStorageManager : IStorage
{
public double GetRemainingStorage()
{
return NSFileManager.DefaultManager.GetFileSystemAttributes(Environment.GetFolderPath(Environment.SpecialFolder.Personal)).FreeSize;
}
}
В вашей реализации Android добавьте следующий код над пространством имен:
[assembly: Xamarin.Forms.Dependency(
typeof(AndroidStorageManager))]
Для iOS:
[assembly: Xamarin.Forms.Dependency(
typeof(iOSStorageManager))]
Чтобы получить хранилище:
IStorage storageManager = DependencyService.Get<IStorage>();
double remaining = storageManager.GetRemainingStorage();
Надеюсь, это прояснило ситуацию.
Проверьте мой исправленный ответ. @ШирамА. - подскажите работает или нет
Проверьте количество свободного места на вашем диске, так как вы записываете файл.