获取所有外部安装的设备(USB,SD卡)

时间:2016-01-08 18:36:59

标签: android usb storage external sd-card

我已经好几天都想要一个明确的答案,但我仍然不满意我找到的解决方案。所以我再次询问stackoverflow:

是否有任何有效的方法可以在Android设备上安装所有已安装的外部存储空间? 我知道管理外部存储总是取决于设备的生产者。但我不想发布我的应用程序并等待传入​​的“错误”。

所以我根据两种不同的设备(三星和Acer)制作了我的“试错法”代码。

附加中的代码可以满足我的需求(但仍然不完美,因为Acer设备的“mnt”和“存储”中都显示了SD卡,而且名称不同更多)。

我知道这段代码不是一种专业的管理方法,请帮助我找到更好的解决方案。

 public static List<StorageInfo> getStorageList() {
    List<StorageInfo> list = new ArrayList<>();
    List<File> typicallFolders = new ArrayList<>();
    typicallFolders.add(new File("/storage"));
    typicallFolders.add(new File("/mnt"));
    int internalNumber = 1;
    HashSet<String> knownPaths = new HashSet<>();
    for(File fs:typicallFolders) {
        try {
            if(!fs.exists())
                continue;
            for (File f : fs.listFiles()) {
                File finalPath = getexternalStorage(f, 1);
                if (finalPath != null && !knownPaths.contains(finalPath.toString()) && finalPath.canWrite()) {
                    list.add(new StorageInfo(finalPath.toString(), true, true, internalNumber++));
                    knownPaths.add(finalPath.toString());
                }
            }

        } catch (Exception e) {
            //Catch exception if any
            e.printStackTrace();
        }
    }
    return list;
}

private static File getexternalStorage(File path,int depth){
    if(Environment.isExternalStorageRemovable(path))
        return path;
    File[] subFolders = path.listFiles();
    if(depth == 3 || subFolders.length != 1){
        return null;
    }
     return getexternalStorage(subFolders[0],depth++);
}

1 个答案:

答案 0 :(得分:0)

最后,对于我的问题,Jared Rummler的回答完全涵盖了我的要求。唯一的问题是我没有获得此文件夹的任何权限。所以我实际做的是使用存储访问框架(http://developer.android.com/guide/topics/providers/document-provider.html),它完全涵盖了我的需求。非常感谢Rummler,我真的想把你的答案标记为正确的。请提供您的推荐作为答案。