【问题标题】:It is possible to get total storage capacity?有可能获得总存储容量吗?
【发布时间】:2013-01-10 00:10:18
【问题描述】:

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

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

有可能实现吗?

谢谢

【问题讨论】:

  • 就像某种函数,将这两个值加在一起...... ;-)
  • 你不明白我的意思,我想要内部的最大容量和外部的最大容量,我不想要内部+外部的总和......

标签: android storage sd-card


【解决方案1】:

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;

【讨论】:

  • 我使用 api 级别 16,这个函数给我 logcat 11-22 14:29:45.933: D/MainActivity(6092): getTotalInternalExternalMemorySize 方法调用 11-22 14:29:45.933: D/ MainActivity(6092):如果块 11-22 14:29:45.933:D/MainActivity(6092):总内存:-704 MB 11-22 14:29:45.933:D/MainActivity(6092):空闲内存:-641 MB 11-22 14:29:45.933:D/MainActivity(6092):已用内存:-63 MB
【解决方案2】:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;

Source

此外,将其用于内部尺寸。

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

【讨论】:

    【解决方案3】:

    此方法不适用于所有手机,大多数手机返回用户可用的内存总量,较少的系统内存。您可以尝试使用 NDK 在 c++ 方法中使用 'df -h' linux 命令,但有些手机仅将其设为系统 (su) 命令。所以总而言之,你不能。

    【讨论】:

      【解决方案4】:

      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(),请检查此值。在具有多个共享/外部存储目录的设备中,此目录表示用户将与之交互的主存储。

      您需要像这样使用路径的字符串值: “/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(":");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2017-09-03
        • 2020-08-29
        相关资源
        最近更新 更多