【Android】【版本适配】Android11权限适配终极解决⽅案Android11有了哪些改动
Android11主要是进⼀步收缩了应⽤权限,在权限管理⽅⾯⽐以前更加严格
最主要,影响最⼤的,就是存储卡访问权限的调整
从Android11开始,应⽤将只能访问⾃⼰的私有⽬录
其它⽬录,只能判断⽂件是否存在,但是既不能读取,也不能写⼊
这直接影响到⽂件选取、拍照录像录⾳、⽂件分享、⽂件下载等功能
对开发者影响⾮常⼤,特别是严重依赖于外部存储的项⽬
应对⽅案
⾸先摆正⼼态,积极适配,不要抗拒变化,逃避问题,影响⽐较多,我们逐个击破
Android11获取应⽤安装列表
Android11获取应⽤列表,需要登记额外权限
<!-- 获取应⽤列表 -->
<uses-permission name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission name="android.permission.REQUEST_INSTALL_PACKAGES"/>
Android11使⽤外部存储
Android11并没有完全禁⽤外部存储
但是只能通过⽤户⼿动授予权限的⽅式来实现,不能通过代码去申请
登记外部存储访问权限
<!-- 存储 -->
<uses-permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android11适配机型<!-- 申请外部存储访问权限 -->
<application
preserveLegacyExternalStorage="true"
requestLegacyExternalStorage="true">
</application>
判断有没有完全的外部存储访问权限
Environment.isExternalStorageManager();
打开完全外部存储访问权限申请页⾯
Intent intent =new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:"+getPackageName()));
startActivityForResult(intent,10001);
Android11使⽤公共媒体⽬录
可通过以下API获取公共媒体⽬录
String documentDirectory = ExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).toString();
String downloadDirectory = ExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
Android11使⽤私有⽬录
这是Android官⽅推荐的做法,每个应⽤只访问⾃⼰私有⽬录的数据
这个⽬录在存储卡中是不可见的,只有应⽤⾃⼰可以通过代码访问
String privateRoot = ExternalStorageDirectory()+"/Android/data/"+ PackageName()+"/";
分享
Android11中的分享失败,是由⽂件访问权限间接引起的
解决以上问题后,分享的问题也就迎刃⽽解了
定义⼀个⾃⼰的FileProvider,通过UriForFile来获取Uri,然后通过Uri分享
不会的搜索⼀下FileProvider和分享相关的博客就⾏了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论