解决安卓10获取外部存储权限问题,导致播放本地视频文件错误。

it2025-10-14  11

当项目 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  

拿到这个路径就可以播放视频 图片 或者其它任何东西啦

 

 

最新回复(0)