gddhy

_(:з」∠)_ 加载中...
  • 主页
  • 归档
  • 工具
  • 关于
所有文章 友链

gddhy

_(:з」∠)_ 加载中...

  • 主页
  • 归档
  • 工具
  • 关于

Android11 无Root 访问data目录

2021-05-09
字数统计:438字 阅读时长≈2分

看到MT管理器、储存空间管理这些应用都能直接通过SAF框架来操作Android/data目录,安卓11谷歌在SAF选择目录时是不提供Android/data目录的,在CSDN找到了这个解决方法

记录到自己的博客中,作为前面安卓储存权限适配的补充,以备后面需要

通过SAF提供的DocumentFile操作文件会比File直接操作要慢

需要在 build.gradle 中添加引用

1
implementation 'androidx.documentfile:documentfile:1.0.1'

下面直接贴代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class DataFilesUtils {
//直接获取data权限
public static void startForRoot(Activity context, int REQUEST_CODE_FOR_DIR) {
Uri uri = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentFile.getUri());
context.startActivityForResult(intent, REQUEST_CODE_FOR_DIR);
}

//在ActivityResult中保存权限
public static void savePermission(Context context,Intent data){
Uri uriTree = data.getData();
if(uriTree == null){
return;
}
final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
context.getContentResolver().takePersistableUriPermission(uriTree, takeFlags);
}

//判断是否已经获取了Data权限,改改逻辑就能判断其他目录,懂得都懂
public static boolean isGrant(Context context) {
for (UriPermission persistedUriPermission : context.getContentResolver().getPersistedUriPermissions()) {
if (persistedUriPermission.isReadPermission() && persistedUriPermission.getUri().toString().equals("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata")) {
return true;
}
}
return false;
}

//获取Android/data目录
public static DocumentFile getDataFile(Context context){
Uri uri = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
return DocumentFile.fromTreeUri(context, uri);
}

//根据路径获得document文件
public static DocumentFile getDoucmentFile(Context context, String path) {
if (path.endsWith("/")) {
path = path.substring(0, path.length() - 1);
}
String path2 = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
Uri uri = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A" + path2);
return DocumentFile.fromSingleUri(context, uri);
}
}

相关代码来自Android11 无Root 访问data目录实现、Android11访问data目录、Android11解除data目录限制、Android11 data空白解决

赏

谢谢你请我吃糖果

微信

扫一扫,分享到微信

微信分享二维码
Toolbar使用
Java获取Mrp信息
目录,不存在的…
留言已关闭
:gddhy
© gddhy
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链

tag:

  • Android
  • 软件分享
  • game
  • Hexo
  • JavaScript
  • 旧机博物馆
  • MIUI
  • Java
  • git
  • Termux
  • mtk
  • 原神
  • Win
  • Html
  • 安卓学习笔记

    缺失模块

  • Luminous' Home
  • 影子博客
  • 四次元领域
  • 初之音
  • Mr.Pumpkin
  • ZhaoQuinn 's Blog