android预置资源到data分区,Android R 如何访问Android/data目录?

前言

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。

d02bc6266198

摘自官方文档

d02bc6266198

摘自官方文档

基本使用

通过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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值