Я хочу программно получить размер свободной памяти на внутреннем / внешнем накопителе моего устройства. Я использую этот фрагмент кода:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);
File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format = Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
и результат, который я получаю:
11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
Проблема в том, что я хочу получить свободную память SdCard, которая есть 1,96GB
прямо сейчас. Как я могу исправить этот код, чтобы получить бесплатный размер?
android
android-sdcard
diskspace
Android-дроид
источник
источник
Ответы:
Ниже приведен код для вашей цели:
Получить размер RAM
источник
getBlockSize()
иgetBlockCount
устарели.Вот как я это сделал:
источник
getBlockSize
иgetAvailableBlocks
наgetBlockSizeLong
иgetAvailableBlocksLong
.Начиная с API 9 вы можете:
источник
File.getUsableSpace()
выглядит как простой метод использовать , а не использоватьStatFs
. Зачем мне использоватьStatFs
@MarkCarter?Чтобы получить все доступные папки хранилища (включая SD-карты), вы сначала получите файлы хранилища:
Затем вы можете получить доступный размер каждого из них.
Сделать это можно тремя способами:
API 8 и ниже:
API 9 и выше:
API 18 и выше (не требуется, если подходит предыдущий):
Чтобы получить красивую отформатированную строку того, что у вас есть сейчас, вы можете использовать:
или вы можете использовать это, если хотите увидеть точное количество байтов, но красиво:
Обратите внимание, что я думаю, что внутреннее хранилище может быть таким же, как первое внешнее хранилище, поскольку первое является эмулированным.
РЕДАКТИРОВАТЬ: Используя StorageVolume на Android Q и выше, я думаю, что можно получить свободное место для каждого, используя что-то вроде:
Я не уверен, что это правильно, и я не могу найти способ получить общий размер каждого, поэтому я написал об этом здесь и спросил об этом здесь .
источник
@ Android-Droid - вы неправильно
Environment.getExternalStorageDirectory()
указываете на внешнее хранилище, которое не обязательно должно быть SD-картой, оно также может быть монтировкой внутренней памяти. Видеть:Найдите расположение внешней SD-карты
источник
Попробуйте этот простой фрагмент
источник
java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648
ошибка, кажется,digitGroups
результат -2147483648.Очень легко узнать доступное хранилище, если у вас есть внутренний и внешний путь хранения. Кроме того, внешний путь к памяти телефона действительно очень легко узнать, используя
Поэтому я просто концентрируюсь на том, как узнать пути внешнего съемного хранилища, такого как съемная SD-карта, USB OTG (не тестировался USB OTG, так как у меня нет USB OTG).
Ниже приведен список всех возможных путей внешнего съемного хранилища.
источник
Быстрое добавление в тему Внешняя память
Пусть вас не смущает название метода
externalMemoryAvailable()
в ответе Динеш Праджапати.Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
дает вам текущее состояние памяти, если носитель присутствует и смонтирован в своей точке монтирования с доступом для чтения / записи. Получитсяtrue
даже на устройствах без SD-карт, вроде Nexus 5. Но все же это метод «must-have» перед любыми операциями с хранилищем.Чтобы проверить, есть ли на вашем устройстве SD-карта, вы можете использовать метод
ContextCompat.getExternalFilesDirs()
Он не показывает переходные устройства, такие как USB-накопители.
Также имейте в виду, что
ContextCompat.getExternalFilesDirs()
на Android 4.3 и ниже всегда будет возвращаться только 1 запись (SD-карта, если она доступна, в противном случае внутренняя). Вы можете прочитать об этом здесь .в моем случае этого было достаточно, но не забывайте, что на некоторых устройствах Android может быть 2 SD-карты, поэтому, если вам нужны все они - скорректируйте код выше.
источник
Класс StorageStatsManager представил Android O и выше, который может предоставить вам свободный и общий байт во внешнем / внутреннем хранилище. Подробнее с исходным кодом вы можете прочитать в моей следующей статье. вы можете использовать отражение для ниже, чем Android O
https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b
источник
Так я и сделал ..
внутренняя Общая память
Внутренний свободный размер
Внешняя свободная и общая память
источник
По поводу внешней менории есть еще один способ:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();
источник
После проверки другого решения напишите код сам, это полный код для поиска
'' ''
источник