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和微信分享相关的博客就行了
————————————————
版权声明:本文为CSDN博主「命运之手」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013718730/article/details/118185047