当前位置: 首页 > news >正文

ErrnoException: open failed: EPERM (Operation not permitted)

在应用权限管理里面没有文件读写权限

<!--        // 1. 适配分区存储的特性,并在清单文件中注册一个 meta-data 属性-->
<!--        // <meta-data android:name="ScopedStorage" android:value="true" />-->
<!--        // 2. 如果不想适配分区存储,则需要使用 Permission.MANAGE_EXTERNAL_STORAGE 来申请权限-->
<!--        // 上面两种方式需要二选一,否则无法在 Android 11 的设备上正常读写外部存储上的文件-->
如果当前项目在没有适配分区存储的情况下,申请 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限当项目的 targetSdkVersion >= 29 时,需要在清单文件中注册 android:requestLegacyExternalStorage="true" 属性,否则框架会抛出异常,如果不加会导致一个问题,明明已经获取到存储权限,但是无法在 Android 10 的设备上面正常读写外部存储上的文件。当项目的 targetSdkVersion >= 30 时,则不能申请 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,而是应该申请 MANAGE_EXTERNAL_STORAGE 权限如果当前项目已经适配了分区存储,那么只需要在清单文件中注册一个 meta-data 属性即可: <meta-data android:name="ScopedStorage" android:value="true" />
如果你同时申请了 MANAGE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 这三个权限,框架会抛出异常,告诉你不要同时申请这三个权限,这是因为在 Android 11 及以上设备上面,申请了 MANAGE_EXTERNAL_STORAGE 权限,则没有申请 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限的必要,这是因为申请了 MANAGE_EXTERNAL_STORAGE 权限,就等于拥有了比 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 更加强大的能力,如果硬要那么做反而适得其反,假设框架允许的情况下,会同时出现两种授权方式,一种是弹窗授权,另一种是跳页面授权,用户要进行两次授权,但是实际上面有了 MANAGE_EXTERNAL_STORAGE 权限就满足使用了,这个时候大家可能心中有一个疑问了,你不申请 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限,Android 11 以下又没有 MANAGE_EXTERNAL_STORAGE 这个权限,那不是会有问题?关于这个问题大家可以放心,框架会做判断,如果你申请了 MANAGE_EXTERNAL_STORAGE 权限,在 Android 11 以下框架会自动添加 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 来申请,所以在低版本下也不会因为没有权限导致的无法使用。

请参考
https://github.com/getActivity/XXPermissions

 public void verifyStoragePermissions(Activity activity) {XXPermissions.with(this)// 申请单个权限.permission(Permission.MANAGE_EXTERNAL_STORAGE)// 申请多个权限
//                .permission(Permission.Group.CALENDAR)// 设置权限请求拦截器(局部设置)//.interceptor(new PermissionInterceptor())// 设置不触发错误检测机制(局部设置)//.unchecked().request(new OnPermissionCallback() {@Overridepublic void onGranted(List<String> permissions, boolean all) {if (all) {toast("获取权限成功");} else {toast("获取部分权限成功,但部分权限未正常授予");}}@Overridepublic void onDenied(List<String> permissions, boolean never) {if (never) {toast("被永久拒绝授权,请手动授予权限");// 如果是被永久拒绝就跳转到应用权限系统设置页面XXPermissions.startPermissionActivity(getActivity(), permissions);} else {toast("获取权限失败");}}});}
http://www.lryc.cn/news/384618.html

相关文章:

  • 乘法与位运算
  • HTML(20)——定位
  • 精通scikit-learn:模型持久化与选择的最佳实践
  • JMeter安装与使用
  • ubuntu 20.04 访问csdn报错 Secure connection failed
  • Linux下如何设置可执行文件和库文件的环境变量?
  • gsap动画库对threejs模型的应用
  • 网管工作实践_02_IP/MAC地址管理工具
  • MySQL【触发器、存储过程、函数、范式】
  • Shopee API接口——获取商家店铺商品列表
  • linux基础知识14
  • Qt开发入门与环境搭建(基础篇)
  • CentOS7环境Maxwell的安装及使用
  • python环境变量
  • 用进程和线程完成TCP进行通信操作及广播和组播的通信
  • 浅谈Tomcat
  • C++精解【7】
  • 堆箱子00
  • Linux 命令:iftop
  • web学习笔记(六十九)vue2
  • JavaScript全解:从基础到高级,掌握每一个知识点
  • RabbitMQ的Direct交换机
  • 2024.6.26 待学习知识点
  • 【LeetCode】每日一题:相交链表
  • 6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类
  • [leetcode]avoid-flood-in-the-city 避免洪水泛滥
  • Pytorch基础
  • 嵌入技术Embedding
  • Pandas中的数据转换[细节]
  • vue2面试题——路由