获取所有外部挂载设备(USB,SD卡)

3

我已经寻找了几天,但是我还没有找到令人满意的解决方案。所以我在stackoverflow上再次提问:

有没有一种有效的方法可以获取Android设备上所有已挂载的外部存储设备? 我知道管理外部存储设备始终取决于设备的生产商。但我不想发布我的应用程序并等待“错误”发生。

因此,我基于两个不同的设备(三星和宏碁)进行了“试错”编码。

附加代码对我的需求产生了最佳结果(但仍然不完美,因为Acer设备的SD卡在“mnt”和“storage”中都显示,并且使用不同名称)。

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

 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++);
}

你最好将外部存储更改为可移动存储。因为有内部、外部和可移动三种存储方式。前两种属于设备,无法移除。 - greenapps
真的,这样措辞会更好。你对结果有什么建议吗? - xandi1987
2
试试这个:https://gist.github.com/jaredrummler/49ec70139d8148244e4d - Jared Rummler
这似乎完美运行。我仍然唯一的问题是我无法在那里写文件。我已经添加了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,但我无法写入目录或文件(权限被拒绝错误)。你能再帮我一次吗? - xandi1987
也许我可以提供一些我的想法背景:我想提供自动备份功能。因此,用户通过设置(例如在SD卡或USB上,甚至是云端)定义备份路径,应用程序会自动将数据保存到该路径(因此无需进一步的用户操作)。经过更多的研究,我发现了存储访问框架。也许这是一个更好的使用想法?我只做了一些小实验,但它似乎很有前途。你觉得呢? - xandi1987
1个回答

0

最后,对于我的问题,Jared Rummler的答案正好涵盖了我所问的内容。唯一的问题是我没有获得这些文件夹的任何权限。因此,我实际上使用了存储访问框架(http://developer.android.com/guide/topics/providers/document-provider.html),它完全满足了我的需求。非常感谢Rummler,我真的很想将您的答案标记为正确答案。请提供您的评论作为答案。


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