Как получить внутреннее хранилище sdcard и внешнее (удаление) хранилище sdcard и системное хранилище и доступное состояние памяти в android?

Я новичок в Android. Мне нужен простой код для получения Внутреннего хранилища и внешнего хранилища и Системного хранилища, а также как получить информацию о доступной памяти (внутренней и внешней), общем объеме памяти. Мой код ниже, но он получает ошибку в методе "StatFs". Заранее спасибо.

    long total, aval,total1, aval1,total2, aval2;
    int kb = 1024;

    StatFs fs = new StatFs(Environment.
                            getExternalStorageDirectory().getPath());

    total = fs.getBlockCount() * (fs.getBlockSize() / kb);
    aval = fs.getAvailableBlocks() * (fs.getBlockSize() / kb);
    //Here Iam Getting error StatFs method not loading
    StatFs fs1 = new StatFs(Environment.
    getRootDirectory()+"/storage/extSdCard/");


 total1 = fs1.getBlockCount() * (fs1.getBlockSize() / kb);
 aval1 = fs1.getAvailableBlocks() * (fs1.getBlockSize() / kb);

    pb1.setMax((int)total);
    pb1.setProgress((int)aval);
    pb2.setMax((int)total1);
    pb2.setProgress((int)aval1);

}

1 ответ

Решение

При доступе к сервисам SDCARD Всегда начинайте с проверки того, установлена ​​ли в данный момент SDCARD. Вы не можете предположить, что это:

String state = Environment.getExternalStorageState();

if (state.equals(android.os.Environment.MEDIA_MOUNTED)) {
       // is mounted, can continue and check size

        StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
        long AvailableBytes = (long)stat.getBlockSize() *(long)stat.getBlockCount();
        long AvailableInMegas = AvailableBytes / 1048576; // <------------------
}


Теперь, чтобы получить доступное внутреннее хранилище:

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
long availableInternalInBytes = formatSize(availableBlocks * blockSize);

Примечание: приведенное выше вернет доступное хранилище для всех, а не только для вашего приложения!


Получить использование памяти:

final Runtime runtime = Runtime.getRuntime();
final long totalMem = runtime.totalMemory(); // <--------- total for YOUR JVM!
final long freeMem = runtime.freeMemory();  // <--------- free in YOUR JVM!
final long usedMem = totalMem - freeMem; // <--------- used in YOUR JVM!
final long maxMem = runtime.maxMemory()  // <--------- the max amount of mem that YOUR JVM may attempt to use

Все значения в байтах.


И наконец - опрос внешней памяти (не SDCARD):

Ваш код предполагает, что путь к указанному выше является "/mnt/extSdCard/". Это не гарантировано. В некоторых устройствах это "/mnt/external_sd/". И могут быть другие имена..

Что вам нужно сделать, это начать, перечислив все подключенные устройства хранения данных и каким-то образом (программно, пользовательское вмешательство...) выбрать свое. Способ сделать это заключается в следующем:

File mountedRoot = new File("/mnt/");
if(mountedRoot.isDirectory()) {
    String[] allMountedFolders = storageDir.list();
    if (allMountedFolders != null) {
         for (String f: allMountedFolders) {
               // iterate over all mounted devices <-----------------------
         }
    }

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