Android 11 访问 Android/data/或者getExternalCacheDir() 非root方式

前言
需求要求安装三方应用ExternalCacheDir()下载下来的apk文件。
getExternalCacheDir() : /storage/emulated/0/Android/data/com../cache/

获取访问权限
如果手机安卓版本为Android10的时候,可以在AndroidManifest.xml中添加下列代码

   android:requestLegacyExternalStorage="true"

以此禁用分区存储,但这在Android11及以上版本不起作用。

使用 Storage Access Framework 请求访问权限。
SAF 提供了一种标准化的方式来让应用程序请求访问其他应用的文件和目录。要使用 SAF 请求访问 Android/data 目录。

	private static int REQUEST_CODE_FOR_DIR = 10525;

    //通过SAF获取权限
 	public  void startForSAF(Activity activity) {
        Uri uri = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
        DocumentFile documentFile = DocumentFile.fromTreeUri(activity, 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);
        assert documentFile != null;
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentFile.getUri());
        activity.startActivityForResult(intent, REQUEST_CODE_FOR_DIR);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Uri uri;
        if (requestCode == REQUEST_CODE_FOR_DIR && (uri = data.getData()) != null) {
            getContentResolver().takePersistableUriPermission(uri, data.getFlags() & (
                    Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
            finish();
        }
    }
    //使用时
    public static Uri pathToUri(String path) {
        return Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A" +path.replace("/storage/emulated/0/", "").replace("/", "%2F"));
    }

效果如下:
在这里插入图片描述

在这里插入图片描述

相关推荐

  1. Android U user+root实现方案

    2024-02-07 16:56:04       15 阅读
  2. 记录 | root用户使用docker的方法

    2024-02-07 16:56:04       27 阅读
  3. android11 申请所有文件访问权限

    2024-02-07 16:56:04       15 阅读
  4. Android Room数据库升级Margen解决方案

    2024-02-07 16:56:04       40 阅读
  5. root运行docker容器

    2024-02-07 16:56:04       41 阅读
  6. Android Root全教程

    2024-02-07 16:56:04       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 16:56:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 16:56:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 16:56:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 16:56:04       20 阅读

热门阅读

  1. 《Docker极简教程》--Docker基础--基础知识(三)

    2024-02-07 16:56:04       25 阅读
  2. 在资料甚少的情况下如何做安全加固?

    2024-02-07 16:56:04       32 阅读
  3. Vivado -RAM

    2024-02-07 16:56:04       28 阅读
  4. 电脑访问网站受限

    2024-02-07 16:56:04       29 阅读
  5. matlab | 一些总是忘记多次查的快捷键及符号

    2024-02-07 16:56:04       28 阅读
  6. C++二维vector转换为一维vector

    2024-02-07 16:56:04       31 阅读