Могу ли я проверить доступное хранилище на устройстве в Xamarin Forms?

Я пытаюсь создать приложение, которое требует, чтобы я часто отправлял записанные данные в базу данных Firebase. Когда сеть отключается или батарея вот-вот разрядится, я сохраняю все данные, которые не были сохранены в firebase локально. Однако для этого мне требуется около 20 МБ данных (у меня довольно большие данные). При этом я хочу найти способ проверить доступное хранилище (и, если возможно, батарею), чтобы предупредить пользователя. Возможно ли это с помощью Xamarin Forms? Кроме того, есть ли способ сделать это решение универсальным (т.е. мне не нужен отдельный фрагмент кода для iOS и Android)? (Я новичок в Xamarin и С#)

Проверьте количество свободного места на вашем диске, так как вы записываете файл.

jdweng 24.12.2020 16:56

Что вы имеете в виду под этим? Я пытаюсь найти доступное место на устройстве, на котором запущено приложение.

Sriram A. 24.12.2020 21:24

@ШирамА. ты видел мой ответ?

user14090664 24.12.2020 21:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
1 213
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте следующий код, чтобы проверить свободный размер устройства:

Для 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();

Надеюсь, это прояснило ситуацию.

Проверьте мой исправленный ответ. @ШирамА. - подскажите работает или нет

user14090664 24.12.2020 22:06

Другие вопросы по теме