android10适配
Android Q文件存储机制修改成了沙盒模式,和IOS神似
应用只能访问自己沙盒下的文件和公共媒体文件
对于Android Q以下,还是使用老的文件存储方式
Android Q不再需要申请文件读写权限,默认可以读写自己沙盒文件和公共媒体文件。所以,Q以上不需要再动态申请文件读写权限。
-----------------
一、Android Q的私有目录
这里的私有目录即是 App-specific 目录,具体路径大概是“内部存储设备/Android/data/com.项目包名/”下,这个私有目录:
(1)APP 卸载在这里插入代码片后,数据会清除。
(2)APP 访问自己的 App-specific 目录时无需任何权限。
(3)可以使用FileProvider分享使用自己私有目录的文件。
所以在沙盒化的Q系统下,在此目录处理文件不会造成垃圾文件对内部存储目录结构影响,卸载后还会自动清除具有很方便的“自消化”特性。在其目录内部的文件操作和Q之前的版本一样,可以随意处理,这里就不做概述了。
二、Android Q的公共目录
公共目录有:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones 等。
(1)公共目录下的文件在 APP 卸载后,不会删除。
(2)APP 可以通过 SAF框架(System Access Framework)、MediaStore 接口访问其中的文件。
(3)无法直接使用路径访问公共目录文件。
由于公共目录没有办法直接访问和处理文件,所以我们需要按照Android Q的新规则来进行文件的处理,要使用到ContentResolver 和MediaStore数据库和Cursor 来进行查询等
---------
Google 在最新的 Android 版本中禁止了,开始用官方推荐的 FileProvider 模式来解决 FileUriExposedException 问题。当然,用官方的方式解决问题,也要对版本进行区分。出去一些 file_path 和 AndroidManiFest 文件的配置,在 Java 中进行如下适配:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24) {
Uri apkUri = FileProvider.getUriForFile(context, "com.xxx.xxx.fileprovider", new File(filePath));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive");
}
try {
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();}
异常:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///storage/emulated/0/com.xxx.xxx/cache/xxx.apk
- 1: Activity 没有注册或者根本没有该 Activity
- 2:想要调整的应用本地不存在
- 3:URI 的文件格式不对
- 4:没有访问 URI 对应的文件的权限
参考:https://blog.csdn.net/yehui928186846/article/details/101706238
https://www.dazhuanlan.com/2019/10/23/5db01b9798489/
https://blog.csdn.net/kai545/article/details/100556189