当项目 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
拿到这个路径就可以播放视频 图片 或者其它任何东西啦