我在运行Android Oreo的外部sd卡上写一个奇怪的问题:
首先是常用命令 getExternalFilesDir(null).getAbsolutePath() 要么 Environment.getExternalStorageDirectory()。getAbsolutePath()
返回仿真存储的路径,而不是有时称为辅助外部存储的真实SD卡。
但这不是问题,因为我设法使用帖子末尾所述的getExternalStoragePath()方法来获取SD卡的路径。
现在奇怪的是,我无法获得创建目录的应用程序(例如,软件包为com.example.myapp)
SDCARDPATH / Android / data / com.example.myapp / files
尽管已正确授予了所有必要的授权(但WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE可能仅适用于仿真存储,但我感觉存在问题!)这就是我正在做的事情:
String SDCARDPATH=getExternalStoragePath(this, true);
File md = new File(new File(new File(new File(SDCARDPATH,"Android"),"data"),PACKAGE_NAME),"files");
if(!md.exists()) {
try {
md.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}
奇怪的是,如果我通过电话文件浏览器手动创建目录,则该应用程序可以在该目录中进行写入和读取而没有任何麻烦。
所以我的问题是如何在外部sdcard上正确创建该目录
旁注,我发现手机上安装的某些应用程序已设法在SD卡上创建了它们的应用程序目录。
最后是我使用的getExternalStoragePath方法,该方法是在网上抓取的:
感谢所有人的帮助,
Lea
public static String getExternalStoragePath(Context mContext, boolean is_removable) {
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removable == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
答案 0 :(得分:0)
我设法使用帖子末尾描述的getExternalStoragePath()方法来获取SD卡的路径
该代码不适用于所有版本的Android。特别是,它不适用于Android 10+。如果它同样在Android 9.0上失败,我也不会感到惊讶,因为它依赖于反射到系统类中。在不存在这些类和方法的较旧设备上,该操作也会失败。
首先,通常的命令getExternalFilesDir(null).getAbsolutePath()或Environment.getExternalStorageDirectory()。getAbsolutePath()返回仿真存储的路径,而不是有时称为辅助外部存储的真实SD卡
使用getExternalFilesDirs()
(注意末尾的s
)。返回File[]
。如果该数组具有2个以上的元素,则除第一个元素外,所有元素都指向可移动存储上的目录,您可以在没有任何权限的情况下从应用程序使用它们。该目录应该已经创建,但是您可以在mkdirs()
上调用File
以确保它存在。