获取内部和外部存储信息-android

Posted

技术标签:

【中文标题】获取内部和外部存储信息-android【英文标题】:get internal and external storage information- android 【发布时间】:2017-02-17 12:34:28 【问题描述】:

我正在开发一个 android 文件管理器应用程序。 所以在主要活动上,我想展示所有可用的存储类型,如内部存储和外部 sd 卡。

所以我使用了这个代码,

public static boolean externalMemoryAvailable() 
    return android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED);


public static long getAvailableInternalMemorySize() 
    File path = Environment.getDataDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSize();
    long availableBlocks = stat.getAvailableBlocks();
    return availableBlocks * blockSize;


public static long getTotalInternalMemorySize() 
    File path = Environment.getDataDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSize();
    long totalBlocks = stat.getBlockCount();
    return totalBlocks * blockSize;


public static long getAvailableExternalMemorySize() 
    if (externalMemoryAvailable()) 
        File path = Environment.getExternalStorageDirectory();

        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();
        return availableBlocks * blockSize;
     else 
        return 0;
    


public static long getTotalExternalMemorySize() 
    if (externalMemoryAvailable()) 
        File path = Environment.getExternalStorageDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long totalBlocks = stat.getBlockCount();
        return totalBlocks * blockSize;
     else 
        return 0;
    

但问题是,它为内部和外部存储提供了相同的内存输出.. 实际上它为内部存储给出了正确的答案。但外置 SD 卡错误。

我认为我在获取 ext sd 卡的路径上是错误的。有什么帮助吗?请。

【问题讨论】:

but wrong for external sd card。确实。您的代码中没有任何内容涉及外部 SD 卡。 its giving me same memory outputs for both internal and external storage..。有趣的。确认! 【参考方案1】:

是的,不同品牌的 android 的 sd 卡位置路径不同,无法保证。 我有一个解决方案,但这适用于 minSdkVersion 19。

static  File dirs[];
dirs = ContextCompat.getExternalFilesDirs(context, null);
//dirs[0] refers to internal memory and dirs[1] gives you external. Call the following methods to get total and available memory details.


public static String getTotalExternalMemorySize(File dirs[]) 
if (dirs.length > 1) 
        StatFs stat = new StatFs(dirs[1].getPath());
        long blockSize = stat.getBlockSizeLong();
        long totalBlocks = stat.getBlockCountLong();
        return readableFileSize(totalBlocks * blockSize);
     else 
        return "NA";


 public static String getAvailableExternalMemorySize(File[] dirs) 
    if (dirs.length > 1) 
        StatFs stat = new StatFs(dirs[1].getPath());
        long blockSize = stat.getBlockSizeLong();
        long availableBlocks = stat.getAvailableBlocksLong();
        return readableFileSize(availableBlocks * blockSize);
     else 
        return "NA";
    


 public static String readableFileSize(long size) 
    if(size <= 0) return "0";
    final String[] units = new String[]  "B", "kB", "MB", "GB", "TB" ;
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024));
    return new DecimalFormat("#,##0.##").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups];

【讨论】:

感谢@pavan。但是你能告诉我,我怎样才能检测到另一个 USB 存储。表示如果手机已将 USB 笔式驱动器与 otg 连接会怎样。那我怎么能在这里检测到呢? 是什么意思,如果手机插入了sd卡,并且连接了pendrive? 您是否尝试循环遍历 dirs[] 数组以检查它是否返回了所有外部挂载?根据文档 getExternalFilesDirs(context, type) 方法执行以下操作:返回应用程序可以放置其拥有的持久文件的所有外部存储设备上的应用程序特定目录的绝对路径 np。如果您需要,我还使用 readableFileSize 方法更新了答案。【参考方案2】:

别忘了设置外部存储的权限 &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;

另见Accessing getExternalStorageDirectory

【讨论】:

以上是关于获取内部和外部存储信息-android的主要内容,如果未能解决你的问题,请参考以下文章

Android获取外部和内部存储空间总大小

Android外部存储/内部存储路径获取大全

Android外部存储/内部存储路径获取大全

安卓获取多媒体(包括 视频音频图片)数据

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?