【Android】【版本适配】Android11权限适配终极解决方案

本文概述了Android 11的主要改动,重点关注权限管理的严格化,尤其是对外部存储访问的限制。介绍了如何获取应用列表、请求外部存储权限、使用公共和私有目录,以及应对微信分享权限问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android11有了哪些改动

Android11主要是进一步收缩了应用权限,在权限管理方面比以前更加严格

最主要,影响最大的,就是存储卡访问权限的调整

从Android11开始,应用将只能访问自己的私有目录

其它目录,只能判断文件是否存在,但是既不能读取,也不能写入

这直接影响到文件选取、拍照录像录音、文件分享、文件下载等功能

对开发者影响非常大,特别是严重依赖于外部存储的项目

应对方案

首先摆正心态,积极适配,不要抗拒变化,逃避问题,影响比较多,我们逐个击破

Android11获取应用安装列表

Android11获取应用列表,需要登记额外权限


	<!-- 获取应用列表 -->
	<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
	<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

Android11使用外部存储

Android11并没有完全禁用外部存储

但是只能通过用户手动授予权限的方式来实现,不能通过代码去申请

登记外部存储访问权限


    <!-- 存储 -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

	<!-- 申请外部存储访问权限 -->
    <application
        android:preserveLegacyExternalStorage="true"
        android: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 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).toString();
    String downloadDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();

Android11使用私有目录

这是Android官方推荐的做法,每个应用只访问自己私有目录的数据

这个目录在存储卡中是不可见的,只有应用自己可以通过代码访问


    String privateRoot = Environment.getExternalStorageDirectory() + "/Android/data/" + CommonApplication.ctx.getPackageName() + "/";

微信分享

Android11中的分享失败,是由文件访问权限间接引起的

解决以上问题后,分享的问题也就迎刃而解了

定义一个自己的FileProvider,通过FileProvider.getUriForFile来获取Uri,然后通过Uri分享

不会的搜索一下FileProvider和微信分享相关的博客就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值