当项目 targetSdkVersion >28 的时候,以前的获取 /storage/emulated/0/DCIM/Camera/xxx.mp4 的路径会访问不到,因为安卓10
文件存储机制修改成了沙盒模式。
应用只能访问自己沙盒下的文件和公共媒体文件。坑的一匹,天天改。还是要多看更新文档啊。
解决办法:1.把自己项目的版本降低到28
2.在项目AndroidManifest.xml 中的 application 标签中加入
android:requestLegacyExternalStorage="true"
即可访问。
3.如果以上两种方法都不想,就头铁,要适配。那么就需要把原来的本地文件Uri复制到自己项目的沙盒文件中
/**
*
* @param uri 本地文件URI
* @return 安卓10本地项目的文件的路径
*/
@RequiresApi(api = Build.VERSION_CODES.Q)
public static File uriToFileApiQ(Context context, Uri uri) {
File file = null;
//android10以上转换
if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
file = new File(uri.getPath());
} else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
//把文件复制到沙盒目录
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if (cursor.moveToFirst()) {
String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
try {
InputStream is = contentResolver.openInputStream(uri);
File cache = new File(context.getExternalCacheDir().getAbsolutePath(), Math.round((Math.random() + 1) * 1000) + displayName);
FileOutputStream fos = new FileOutputStream(cache);
FileUtils.copy(is, fos);
file = cache;
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
OK了。对于适配因素,自己去判断下版本对应下,那么对应的file.getPath就是文件私有目录了比如:
/storage/emulated/0/Android/data/自己项目的包名/cache/xxxx.mp4
拿到这个路径就可以播放视频 图片 或者其它任何东西啦
当Android项目targetSdkVersion大于28时,由于新的沙盒存储机制,无法直接访问外部存储的文件。解决办法包括降低版本、设置请求传统存储权限或复制文件到应用沙盒。通过ContentResolver查询文件并复制到应用缓存目录,可以解决访问问题,获得私有目录下的文件路径进行操作。
6040

被折叠的 条评论
为什么被折叠?



