Android 12 - 存储访问框架/范围存储不再工作

标签 android storage storage-access-framework scoped-storage android-12

安卓 12 最近在一些手机上发布,一些用户开始提示存储访问权限:他们不能再授予应用程序对特定文件夹的访问权限(例如,“下载”文件夹)。
消息指示: “无法使用此文件夹。为保护您的隐私,请选择另一个文件夹”。
这个问题很容易重现,我花了一些时间寻找解决方案,但我找不到一个简单的解决方案。
Image of the issue
似乎唯一的解决方法是要求完全存储访问权限(但这不是我想要做的,这很糟糕)或要求用户创建一个新文件夹,这将是 UX 绝对的痛苦。
我不明白的是:谷歌只是 - 没有任何文档 - 在 Android 12 上弃用了 SAF 吗?这是一个错误还是一个功能?我真的很困惑那里。 Android 11 迁移已经很痛苦了,现在恐怕 12 会变得更加痛苦。
这是代码,但没什么特别的:

    /*
    * Requests Scoped Storage access authorization
    */
    @RequiresApi(Build.VERSION_CODES.Q)
    @JvmStatic
    fun requestScopedStorageAccess(activity: Activity, requestCode: Int) {
        val storageManager = activity.getSystemService(Context.STORAGE_SERVICE) as StorageManager
        val intent = storageManager.primaryStorageVolume.createOpenDocumentTreeIntent()
        activity.startActivityForResult(intent, requestCode)
    }
我认为值得注意的是,一切都在 Android 10 和 11 上完美运行,所以问题确实与 Android 12 有关。

最佳答案

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 startSubDir = "Android%2Fdata";

            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/");

            scheme += "%3A" + startSubDir;
            Log.d(TAG, "INITIAL_URI scheme: " + scheme);

            uri = Uri.parse(scheme);

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

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

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

            return;
        }

关于Android 12 - 存储访问框架/范围存储不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69873673/

相关文章:

android - 如何持续跟踪Android手机的位置?

android - 如何使 Android 直接回复通知功能在 Android N 之前的设备上工作?

android - 如何使用 Android 色板

ios - firebase/存储/图像/ View

python - 用于大量文件的 Django 文件系统存储

android - 数据库未存储在 Android 手机设备上

带选择按钮的 Android 目录/文件夹选择器

android - Flutter 应用恢复;当 Activity 被系统杀死时如何保存应用程序状态?

android - 使用 KitKat 存储访问框架后打开 Google Drive File Content URI

java - Android 无法对 SD 卡进行写入和删除操作