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

Android 11 FileProvider的使用和限制

概述:
从Android 7开始,将不允许在app之间,使用file uri,即file://的方式,传递一个file,否则会抛出异常:FileUriExposedException ,其解决方案,就是使用FileProvider,用content://代替file://,同时需要将targetSdk,升级到24。主要用于系统相机拍照及图片裁剪、应用之间数据访问、应用的升级等。

普通应用中使用

  1. 创建FileProvider,继承自FileProvider,这里我用的androidx.core.content.FileProvider
    在这里插入图片描述

  2. 创建file_paths.xml
    在这里插入图片描述
    详细相关配置,可查看fileprovider官网
    在这里插入图片描述

  3. 在AndroidManifest中,配置provider,以及file_paths
    在这里插入图片描述

  4. 使用,这里我们已app升级为例
    在这里插入图片描述

系统应用中使用,就是加了:android:sharedUserId=“android.uid.system”

会发现报异常如下:

会发现这样一条警告日志:

UriGrantsManagerService:ActivityManager: For security reasons, the system cannot issue a Uri permission grant to **** use startActivityAsCaller() instead

,原因是Android 11 ,限制了系统应用对fileProvider的使用,看一下源码,是不是似曾相识:
在这里插入图片描述
注意这里,源码位置,我这边是MTK Android 11的源码,位置不同,是在uri下的 UriGrantsManagerService.java中,而且方法名是checkGrantUriPermissionUnlocked(),并非在AMS中
可以看到,假如我们的app,是系统app或者root app,并且提供的uri的authority不是,“com.android.settings.files”时,打印上述的警告,并返回-1。
修改:
这里我们添加一个条件,可以直接添加我们fileprovider对应的包名
在这里插入图片描述

相关文章:

  • vue3-print打印eletable某一行的数据
  • 油烟净化器选购指南:高效净化与优质服务并存的选择
  • AI论文精读笔记-Generative Adversarial Nets(GAN)
  • 远程访问电脑共享文件
  • ansible_find模块
  • 使用vscode上传git远程仓库流程(Gitee)
  • Vue3 响应式工具函数isRef()、unref()、isReactive()、isReadonly()、isProxy()
  • Springcould -第一个Eureka应用 --- day02
  • SpringBootAdmin源码修改编译002_踩坑记录一堆坑_记录过程_没有成功---VUE工作笔记0027
  • uniapp+uview-plus实现微信小程序自定义tabbar
  • 待机模式中WKUP上升沿模拟开机与关机
  • css总结(记录一下...)
  • 从底层原理上理解ClickHouse 中的稀疏索引
  • freeRTOS 任务的创建、挂起、恢复
  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
  • 在 Ubuntu 20.04 上安装 Python 3.12:详细教程
  • C++学习笔记之引用(基础)
  • ardunio超声波测距实验
  • Docker和anaconda的区别?
  • 单向循环链表
  • 远如《月球背面》,近似你我内心
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 阿尔巴尼亚执政党连续第四次赢得议会选举,反对党此前雇用特朗普竞选经理
  • 体坛联播|C罗儿子完成国家队首秀,德约结束与穆雷合作
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点