我已经寻找了几天,但是我还没有找到令人满意的解决方案。所以我在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++);
}