Можно ли получить общую емкость хранилища?

Я знаю, как получить свободную емкость на внутренней памяти и на внешнем хранилище.

Но я хочу знать максимальную емкость внутренней памяти и максимальную емкость внешнего хранилища, но я не могу найти информацию об этом в Google

можно этого добиться?

Спасибо

5 ответов

Некоторые новые методы были введены в API 18. Это код, который я использовал, чтобы получить общее хранилище (внутреннее + внешнее).

private static final long KILOBYTE = 1024;

StatFs internalStatFs = new StatFs( Environment.getRootDirectory().getAbsolutePath() );
long internalTotal;
long internalFree;

StatFs externalStatFs = new StatFs( Environment.getExternalStorageDirectory().getAbsolutePath() );
long externalTotal;
long externalFree;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
    internalTotal = ( internalStatFs.getBlockCountLong() * internalStatFs.getBlockSizeLong() ) / ( KILOBYTE * KILOBYTE );
    internalFree = ( internalStatFs.getAvailableBlocksLong() * internalStatFs.getBlockSizeLong() ) / ( KILOBYTE * KILOBYTE );
    externalTotal = ( externalStatFs.getBlockCountLong() * externalStatFs.getBlockSizeLong() ) / ( KILOBYTE * KILOBYTE );
    externalFree = ( externalStatFs.getAvailableBlocksLong() * externalStatFs.getBlockSizeLong() ) / ( KILOBYTE * KILOBYTE );
}
else {
    internalTotal = ( (long) internalStatFs.getBlockCount() * (long) internalStatFs.getBlockSize() ) / ( KILOBYTE * KILOBYTE );
    internalFree = ( (long) internalStatFs.getAvailableBlocks() * (long) internalStatFs.getBlockSize() ) / ( KILOBYTE * KILOBYTE );
    externalTotal = ( (long) externalStatFs.getBlockCount() * (long) externalStatFs.getBlockSize() ) / ( KILOBYTE * KILOBYTE );
    externalFree = ( (long) externalStatFs.getAvailableBlocks() * (long) externalStatFs.getBlockSize() ) / ( KILOBYTE * KILOBYTE );
}

long total = internalTotal + externalTotal;
long free = internalFree + externalFree;
long used = total - free;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;

Источник

Кроме того, используйте это для внутреннего размера.

StatFs stat = new StatFs(Environment.getDataDirectory().getPath());

StatFs - Получить общую информацию о пространстве в файловой системе. Это оболочка для Unix statvfs().

С уровня API 18 мы используем

long getTotalBytes - The total number of bytes supported by the file system. 

Для более старого использования API

int getBlockCount ()
int getBlockSize ()

StatFs stat = new StatFs(**path**);
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();

В качестве пути Вы используете Environment.getExternalStorageDirectory(), просмотрите это значение. В устройствах с несколькими каталогами общего / внешнего хранилища этот каталог представляет собой основное хранилище, с которым пользователь будет взаимодействовать.

Вам нужно использовать строковые значения path, например: "/mnt/external_sd/" "/mnt/extSdCard/"

Вы можете получить список всех устройств / mnt / и использовать одно из этих значений.

File allMounted = new File("/mnt/");
if(allMounted.isDirectory()){ 
String[] dirs = allMounted.list();...}

или что-то вроде

var myfile=new Java.IO.File("storage/");
var listOfStorages=myfile.ListFiles();

или же

String[] externals = System.getenv("SECONDARY_STORAGE").split(":");

Этот метод не работает на всех телефонах, большинство телефонов возвращает общий объем памяти, доступной пользователю, за вычетом системной памяти. вы можете попытаться использовать команду linux 'df -h' в методе C++ с использованием NDK, но в некоторых телефонах это делается только системной командой (su). Таким образом, долго и коротко это вы не можете.

          val stat = StatFs(Environment.getExternalStorageDirectory().path)

    val available = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        stat.blockCountLong * stat.blockSizeLong
    } else {
        stat.blockCount.toLong() * stat.blockSize.toLong()
    }
    val totalInMB = bytesAvailable / (1024*1024)
Другие вопросы по тегам