当项目 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
拿到这个路径就可以播放视频 图片 或者其它任何东西啦
————————————————
版权声明:本文为CSDN博主「qin_peng123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qin_peng123/article/details/109218665在这里插入代码片