Android文件系统和可用空间混淆

3
当我想查看安卓设备上的总免费空间时,通常需要查看内部存储和外部存储(SD卡)两者的空间。
根据我在一些SO答案中所读到的内容,我会像这样找到内部存储数据(免费空间、可用空间等):
 File path            = Environment.getDataDirectory();
 StatFs stat          = new StatFs(path.getPath());
 long blockSize       = stat.getBlockSize();
 long totalBlocks     = stat.getBlockCount();
 long availableBlocks = stat.getAvailableBlocks();
 //Logging added to make sure I am not going mad
 Log.v(TAG,"Available Blocks: "+Long.toString(availableBlocks));
 Log.v(TAG,"Total Blocks: "+Long.toString(totalBlocks));
 Log.v(TAG,"Block size: "+Long.toString(blockSize));

如果我想要获取安卓设备的外部存储器(SD卡),我可以运行以下代码:
  FilePath path           = Environment..getExternalStorageDirectory();
  StatFs stat             = new StatFs(Environment.getPath());
  this.extblockSize       = stat.getBlockSize();
  long exttotalBlocks     = stat.getBlockCount();
  long extavailableBlocks = stat.getAvailableBlocks();
  //More logging to ensure I am not mad!
  Log.v(TAG,"EXTAvailable Blocks: "+Long.toString(extavailableBlocks));
  Log.v(TAG,"EXTTotal Blocks: "+Long.toString(exttotalBlocks));
  Log.v(TAG,"EXTBlock size: "+Long.toString(extblockSize));

我说的对吗?这是在Android设备上读取外部和内部存储的方法吗?

假设我说的没错,我有一个小问题。 当我在我的三星Galaxy SIII上运行上面的代码时,上述代码返回相同数量的内存。 现在我知道我的三星手机有大约25GB的内存,并且我插了一张4GB的SD卡。

然而,这两段代码都返回了正确的总共25GB和正确的23GB可用内存,但仅适用于内部存储。 我就是想不出如何读取SD卡的文件系统信息。 请参见下面的日志输出以获取实际输出值。

01-14 20:49:25.485: V/VLRApplication(730): Available Blocks: 6031460
01-14 20:49:25.485: V/VLRApplication(730): Total Blocks: 6702651
01-14 20:49:25.485: V/VLRApplication(730): Block size: 4096

01-14 20:49:25.485: V/VLRApplication(730): EXTAvailable Blocks: 6031460
01-14 20:49:25.485: V/VLRApplication(730): EXTTotal Blocks: 6702651
01-14 20:49:25.485: V/VLRApplication(730): EXTBlock size: 4096

我一定是对这个概念有所误解。请问有人能为我澄清一下吗?调用 Environment.getExternalStorageDirectory() 方法难道不会设置路径到SD卡吗?另外顺便提一句,我还没有在AVD模拟设备中尝试过这个方法。


我完全不确定,但我认为有些设备只有一个外部存储设备。例如,我相当确定 Nexus 7 就是这样设计的。 - Ramon Snir
1个回答

1

大多数人对于“外部”存储的概念与谷歌不同。内部空间被计算为外部存储目录,包括SD卡。

问题在于,物理SD卡被挂载在同一文件系统中,而位置因制造商/ROM而异。这里这里是一些关于此问题的问题。不幸的是,似乎没有设备通用的解决方案。


Geobits,所以我遇到了著名的Android碎片化问题? - Namphibian
哈,其中之一。说实话,我相信谷歌正在试图微妙地推动制造商不再使用SD卡槽。 - Geobits
这很糟糕,没有乐趣。我看到这些问题比我最初想象的更为普遍。不过还是谢谢你提供的信息! - Namphibian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接