Как проверить наличие места на внешнем хранилище? - PullRequest
15 голосов
/ 02 июля 2010

Как проверить, заполнена ли SD-карта или нет, чтобы ваше приложение могло решить, сможет ли оно продолжать выполнять свою работу, т.е. записывать данные во внешнее хранилище, или уведомлять пользователя о том, что в хранилище не хватает места.

Ответы [ 6 ]

14 голосов
/ 17 января 2014

Остерегайтесь переполнения 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;
12 голосов
/ 12 января 2012
/******************************************************************************************
Returns size in MegaBytes.

If you need calculate external memory, change this: 
   StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this: 
   StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());

******************************************************************************************/
    public long totalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return total;
    }

    public long freeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        return free;
    }

    public long busyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        long   busy   = total - free;
        return busy;
    }
8 голосов
/ 09 июля 2010

Используйте StatFs и передайте путь к каталогу внешнего хранилища в конструктор, и вы можете вызывать такие функции, как getAvailableBlocks() и getBlockSize() для объекта StatFs.

4 голосов
/ 02 июля 2010

Я думаю, что вы можете использовать это утверждение для решения вашей проблемы. Это не может проверить, достаточно ли емкости SDCard.

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
    //to do something in here
}
0 голосов
/ 15 апреля 2016

Вот как вы можете получить размеры внутреннего хранилища:

 StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;

Вот как вы можете получить размеры внешнего хранилища (размер карты SD):

 StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;
0 голосов
/ 03 апреля 2012
/**
 * @return Number of bytes available on external storage
 */
public static long getExternalStorageAvailableSpace() {
    long availableSpace = -1L;
    try {
        StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
                .getPath());
        stat.restat(Environment.getExternalStorageDirectory().getPath());
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return availableSpace;
}
...