前言
Android R上分区存储的限制得到进一步加强,无论APP的targetsdkversion是多少,都将无法访问Android/data和Android/obb这二个应用私有目录。这无疑对会部分APP的业务场景及用户体验造成冲击,典型的如下
文件管理类软件:微信、QQ传输的文件无法展示给用户以便捷使用
垃圾清理类软件:清理缓存功能受阻
“你有你的张良计,我有我的过墙梯”,现市面上文件管理类软件(如MT管理器)已解决上述系统限制,本文将浅析其实现方案,并主要分析以下2个问题:
SAF是通过何种方式访问文件系统的,MediaStore API ? File API ? Native Code ?
SAF为何能访问Android/data目录
实现方案
其实现方案很简单,就是通过Intent ACTION_OPEN_DOCUMENT_TREE,启动SAF让用户授权访问Android/data目录,属于官方公开的方法。
前提是APP的targetsdkversion要小于30。
摘自官方文档
摘自官方文档
基本使用
通过Intent启动SAF授权界面,注意URI的百分号编解码(%3A和%2F),别随意替换,否则SAF无法导航到Android/data目录
@TargetApi(26)
private void requestAccessAndroidData(Activity activity){
try {
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata");
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
//flag看实际业务需要可再补充
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
activity.startActivityForResult(intent, 6666);
} catch (Exception e) {
e.printStackTrace();
}