android11 文件读写 访问 android/data 目录

 

1.申请android/data的访问权限

使用intent 跳转系统文件管理器到 android/data 并同意你的应用访问这个文件夹

这里是代码

 Uri uri1 = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
                Intent intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
                intent1.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);
                intent1.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri1);
                startActivityForResult(intent1, 11);

这里的url 是我自己在旧安卓使用文件管理器选择android/data返回的uri 同理 传递这个uri 给文件管理器 自然也会跳转到这文件夹 如果不传递uri 系统文件管理器仍然无法显示 android/data

如果授权完成 会是这样

后续的检测是否授权android/data 就自行查看谷歌文档吧

2.使用uri 访问 android/data 的文件

如果你现在有一个文件的path 那么这样做可以转为可以访问的uri

String[] paths = path.replaceAll("/storage/emulated/0/Android/data", "").split("/");
        StringBuilder stringBuilder = new StringBuilder("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3AAndroid%2Fdata");
        for (String p : paths) {
            if (p.length() == 0) continue;
            stringBuilder.append("%2F").append(p);
        }
        return Uri.parse(stringBuilder.toString());

这个uri 是android/data里的文件的uri 那么现在你可以使用DocumenFile 访问这个文件

具体的DocumentFile 用法可以谷歌下

3.使用ContentResolver 访问文件

如果你的对象是一个文件夹 并且你想要访问这文件夹的文件 那么可以使用ContentResolver.query这个方法

DocumentsContract.buildChildDocumentsUriUsingTree(dirUri, DocumentsContract.getDocumentId(dirUri));

使用这个把uri 转为 resolver 可处理的uri

然后使用 query查询

resolver.query(childrenUri, new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID}, null, null, null);

主要是为了获取DocumentId 用于获取子文件的uri

这个方法是SQL 的方法 当然就可以使用SQL 的语句 可以自行谷歌这个文档

这里是获取子文件的uri

while (cursor.moveToNext()) {
            String documentId = cursor.getString(0);
            Uri uri = DocumentsContract.buildDocumentUriUsingTree(dirUri, documentId);
}

如果可以的话我建议 在此之前判断 resolver.query 返回的 cursor 对象是否是null

这样子我们就再次获取了子文件的uri 了

那么DocumentFile 就能再次派上了用场

DocumentFile documentFile1=DocumentFile.fromSingleUri(context,uri);

DocumentFile 为我们提供了判断是否是 文件夹 文件的方法

如果是文件夹我们可以再次执行这样得循环 如果是文件 我们可以获取大小等

由于清浊并不需要读取文件内容和修改内容 所以这两个怎么做 我并没有做了 当然谷歌的文档说了可以使用I/O 读取 就跟普通的File 操作没区别了到这

4.末

这种方法并不是新方法 只是在安卓11 可以用罢了 早在之前读取联系人等 就是用的这种方法 安卓5.0开始就有了这种读取方法 不过这种方法目前就我看来有一点问题 速度缓慢 容易出现问题 具体问题我已经遇到 在某种情况下会抛出各种exception 给你 当然就需要你catch 一下了

后续的问题再说吧 或许也有其他方法读取 代码并不是原创都是来自谷歌提供的文档

 

 

 

 

参考:https://www.zhihu.com/question/420023759/answer/1705644689

Android中,可以通过File类或者FileProvider来访问/storage/emulated/0/Android/data目录下的文件。这个目录是应用程序的私有外部存储目录,每个应用程序都有自己的文件夹,其他应用程序无法直接访问。 使用File类访问文件的步骤如下: 1. 获取外部存储的根目录路径: ```java String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath(); ``` 2. 构建文件路径: ```java String filePath = rootPath + "/Android/data/your_package_name/files/your_file_name"; ``` 其中,your_package_name是你的应用程序包名,your_file_name是你要访问文件名。 3. 创建File对象并进行操作: ```java File file = new File(filePath); // 进行文件读写操作 ``` 如果你需要在应用程序之间共享文件,可以使用FileProvider来提供访问权限。具体步骤如下: 1. 在AndroidManifest.xml文件中添加FileProvider的配置: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="your_authority" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` 其中,your_authority是一个唯一的字符串,用于标识你的FileProvider。 2. 在res/xml目录下创建file_paths.xml文件,并添加以下内容: ```xml <paths> <external-path name="external_files" path="Android/data/your_package_name/files/" /> </paths> ``` 其中,your_package_name是你的应用程序包名。 3. 构建文件URI并进行操作: ```java File file = new File(getExternalFilesDir(null), "your_file_name"); Uri fileUri = FileProvider.getUriForFile(context, "your_authority", file); // 进行文件读写操作 ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值