解决安卓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在这里插入代码片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 6.0之后,需要动态申请权限才能访问一些敏感的权限,例如读写存储权限。为了获取拍照+本地存储权限,您可以按照以下步骤操作: 1. 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> ``` 2. 在Android 6.0及以上,您需要动态请求这些权限。在您的Activity中添加以下代码: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_CODE_PERMISSIONS); } ``` 其中,REQUEST_CODE_PERMISSIONS是您自定义的请求码。 3. 在您的Activity中实现onRequestPermissionsResult方法,以处理用户的权限请求响应: ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_PERMISSIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户已经授权,可以执行相应操作,如拍照等 } } } ``` 在用户授权后,您就可以执行相应的操作,例如拍照并将照片保存到本地存储中了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值