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

当项目 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在这里插入代码片

猜你喜欢

转载自blog.csdn.net/qq_42223582/article/details/114102773