Android 11 - 读取所有应用程序的 Android/data 目录,无需遗留请求(FileManager/Backup 目的)

Android 11 - Read Android/data directory of all apps without legacy-request (FileManager/Backup purpose)

我想阅读 Android/data 以便我可以提取文档进行备份。 Android 11 已更改 prohibit/limit this,但仍然可以吗?我不想使用传统方法(如果可能的话)。

根据这个 Manage all files on a storage device 谈论 MANAGE_EXTERNAL_STORAGE 许可似乎 Google 声称现在应该不可能(至少用这种方法):

Apps that are granted this permission still cannot access the app-specific directories that belong to other apps because these directories appear as subdirectories of Android/data/ on a storage volume.

https://developer.android.com/training/data-storage/manage-all-files https://developer.android.com/about/versions/11/privacy/storage#other-apps-data

这里storage#other-apps-dataGoogle也说应用不能再访问其他应用Android/data

Access to app-specific directories on external storage On Android 11, apps can no longer access files in any other app's dedicated, app-specific directory within external storage.

在 stackoveflow 上 向我们展示了如何请求许可。

但是我们可以使用它(或任何其他方法)来读取那些被禁止的其他应用程序数据文件夹吗,Android/data/*?

Android 应用程序 'Total Commander' 做到了(在 Android 11),它似乎正在使用 StorageAccessFramework Intent Intent.ACTION_OPEN_DOCUMENT_TREE 来访问文件(猜测基于弹出的 gui),但我也没有弄清楚如何让它工作。它可能的 Total Commander 使用传统方法。

公关请求我在 OneDrive 上有 Total Comander (TC) 的屏幕截图。

我强烈怀疑 TC 只是使用了 target-29 访问方法,我在这里找到了它的权限列表,但找不到它针对哪个版本:Aptoide: TC v3.21

您的问题与您提出的问题的解决方案相同

"How can i let ACTION_OPEN_DOCUMENT_TREE open in a predifined directory?".

好吧,我已经有了解决方案。

尝试过用于 DCIM 和 Android 等,但从未用于 Android/data。

但这也行!

您不能将其与经典文件方式一起使用,而只能与存储访问框架一起使用。

我们将操纵从 StorageManager..getPrimaryStorageVolume().createOpenDocumentTreeIntent().INITIAL_URI 获得的信息。

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
    {
        StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

        Intent intent = sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent();
        //String startDir = "Android";
        //String startDir = "Download"; // Not choosable on an Android 11 device
        //String startDir = "DCIM";
        //String startDir = "DCIM/Camera";  // replace "/", "%2F"
        //String startDir = "DCIM%2FCamera";
       // String startDir = "Documents";
        String startDir = "Android/data";

        Uri uri = intent.getParcelableExtra("android.provider.extra.INITIAL_URI");

        String scheme = uri.toString();

        Log.d(TAG, "INITIAL_URI scheme: " + scheme);

        scheme = scheme.replace("/root/", "/document/");

        startDir = startDir.replace("/", "%2F");

        scheme += "%3A" + startDir;

        uri = Uri.parse(scheme);

        intent.putExtra("android.provider.extra.INITIAL_URI", uri);

        Log.d(TAG, "uri: " + uri.toString());

        ((Activity) context).startActivityForResult(intent, REQUEST_ACTION_OPEN_DOCUMENT_TREE);

        return;
    }