我已经好几天都想要一个明确的答案,但我仍然不满意我找到的解决方案。所以我再次询问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++);
}
答案 0 :(得分:0)
最后,对于我的问题,Jared Rummler的回答完全涵盖了我的要求。唯一的问题是我没有获得此文件夹的任何权限。所以我实际做的是使用存储访问框架(http://developer.android.com/guide/topics/providers/document-provider.html),它完全涵盖了我的需求。非常感谢Rummler,我真的想把你的答案标记为正确的。请提供您的推荐作为答案。