Android 是否有可能获得总存储容量?

Android 是否有可能获得总存储容量?,android,storage,sd-card,Android,Storage,Sd Card,我知道如何获得内存和外部存储的可用容量 但我想知道内存的最大容量和外部存储的最大容量,但我在谷歌上找不到任何相关信息 有可能实现吗 谢谢 此外,将此用于内部尺寸 StatFs stat = new StatFs(Environment.getDataDirectory().getPath()); API 18中引入了一些新方法。这是我用来获取总存储(内部+外部)的代码 私有静态最终长KB=1024 StatFs internalStatFs = new StatFs( Environment

我知道如何获得内存和外部存储的可用容量

但我想知道内存的最大容量和外部存储的最大容量,但我在谷歌上找不到任何相关信息

有可能实现吗

谢谢

此外,将此用于内部尺寸

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

API 18中引入了一些新方法。这是我用来获取总存储(内部+外部)的代码

私有静态最终长KB=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;

这种方法不适用于所有手机,大多数手机返回用户可用的内存总量,系统内存更少。您可以尝试使用NDK在C++方法中使用“DF-H”Linux命令,但是一些电话只允许系统(SU)命令。因此,它的长短是您无法检索的。

-检索有关文件系统上空间的总体信息。这是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();
作为您使用的路径(),请检查此值。在具有多个共享/外部存储目录的设备中,此目录表示用户将与之交互的主存储

您需要使用如下路径的字符串值: “/mnt/external\u 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();


就像某种函数,将这两个值相加…;-)你不明白我的意思,我想要内部的最大容量和外部的最大容量,我不想要内部+外部的总和……我使用api级别16,这个函数给我的是logcat 11-22 14:29:45.933:D/MainActivity(6092):getTotalInternalExternalMemorySize方法,名为11-22 14:29:45.933:D/MainActivity(6092):if块11-22 14:29:45.933:D/main活动(6092):总内存:-704 MB 11-22 14:29:45.933:D/main活动(6092):可用内存:-641 MB 11-22 14:29:45.933:D/main活动(6092):已用内存:-63 MB
var myfile=new Java.IO.File("storage/");
var listOfStorages=myfile.ListFiles();
String[] externals = System.getenv("SECONDARY_STORAGE").split(":");