Остерегайтесь переполнения StatFs и int на новых устройствах
Подход в этот ответ не работает на устройствах с большим внешним хранилищем .Например, на моем Nexus 7 он в настоящее время возвращает ~ 2 ГБ, когда в действительности остается ~ 10 ГБ свободного места.
// DOES NOT WORK CORRECTLY ON DEVICES WITH LARGE STORAGE DUE TO INT OVERFLOW
File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDirectory.getAbsolutePath());
int free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1024 / 1024;
В StatFs есть методы замены, возвращающие long
, getAvailableBlocksLong()
и getBlockCountLong()
, но проблема в том, что они были добавлены только в Уровень API 18 .
Используйте это вместо
Простейшийможно использовать getFreeSpace()
в java.io.File , добавленный на уровне API 9, который возвращает long
:
Возвращает количество свободных байтов в разделесодержащий этот путь.Возвращает 0, если этот путь не существует.
Итак, чтобы получить свободное место на внешнем хранилище («SD-карта»):
File externalStorageDir = Environment.getExternalStorageDirectory();
long free = externalStorageDir.getFreeSpace() / 1024 / 1024;
В качестве альтернативы, если вы действительно хотите использовать StatFs, но нужно поддерживать уровень API <18, это исправит целочисленное переполнение: </p>
File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDir.getAbsolutePath());
long blocks = statFs.getAvailableBlocks();
long free = (blocks * statFs.getBlockSize()) / 1024 / 1024;