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

获取内部和外部存储信息-android,android,file-manager,Android,File Manager,我正在开发一个android文件管理器应用程序。 在主要活动中,我想展示所有可用的存储类型,如内部存储和外部sd卡 所以我用了这个代码 public static boolean externalMemoryAvailable() { return android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); } public sta

我正在开发一个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卡路径时出错了。有什么帮助吗?请注意。

不要忘记设置外部存储的权限


另请参见

是的,不同品牌的android的sd卡位置路径不同,无法保证。 我有一个解决方案,但它适用于MinSDK版本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];
}
静态文件目录[];
dirs=ContextCompat.getExternalFilesDirs(上下文,null);
//dirs[0]表示内部内存,dirs[1]表示外部内存。调用以下方法以获取总内存和可用内存详细信息。
公共静态字符串getTotalExternalMemorySize(文件目录[]){
如果(方向长度>1){
StatFs stat=newstatfs(dirs[1].getPath());
long blockSize=stat.getBlockSizeLong();
long totalBlocks=stat.getBlockCountLong();
返回readableFileSize(totalBlocks*blockSize);
}否则{
返回“NA”;
}
公共静态字符串getAvailableExternalMemorySize(文件[]目录){
如果(方向长度>1){
StatFs stat=newstatfs(dirs[1].getPath());
long blockSize=stat.getBlockSizeLong();
long availableBlocks=stat.getAvailableBlocksLong();
返回readableFileSize(availableBlocks*blockSize);
}否则{
返回“NA”;
}
}
公共静态字符串可读文件大小(长){

如果(大小
但外部sd卡是错误的
。的确。您的代码中没有任何外部sd卡。
它为内部和外部存储提供相同的内存输出。
。有趣。已确认!thanx@pavan。但是,请您告诉我,如何检测另一个usb存储。如果手机已连接,该怎么办将usb笔驱动器与otg连接。那么我如何在这里检测它?意味着如果手机插入了sd卡,并且连接了pendrive,该怎么办?您是否尝试通过dirs[]数组循环检查它是否返回了所有外部挂载?根据文档GetExternalFileDirs(上下文,类型)方法执行以下操作:返回所有外部存储设备上特定于应用程序的目录的绝对路径,应用程序可以在这些设备上放置它所拥有的持久性文件SNP。我还使用readableFileSize方法更新了答案,以备需要。