Android 12 - 存储访问框架/作用域存储不再起作用。

6
最近,一些手机已经发布了Android 12,一些用户开始抱怨存储访问:他们不能再将特定文件夹授予应用程序访问权限(例如,“下载”文件夹)。
该消息显示:“无法使用此文件夹。为保护您的隐私,请选择另一个文件夹”。
这个问题很容易重现,我花了一些时间寻找解决方法,但是我找不到一个简单的方法。

Image of the issue

似乎唯一的解决方法是请求完全存储访问权限(但这不是我想做的,这很糟糕),或者要求用户创建一个新文件夹,这将成为UX的绝对痛苦。
我不明白的是:谷歌是否在Android 12上 - 没有任何文档 - 废弃了SAF?这是个bug还是功能?我真的很困惑。 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的。


谷歌刚刚在Android 12上不经过任何文档的情况下废弃了SAF吗?-- 你尝试从截图中点击“创建新文件夹”按钮了吗?它是否创建了一个新文件夹?你的应用程序是否获得了对该新文件夹的访问权限? - CommonsWare
是的,这就是我所谓的“解决方法2”。似乎只有使用SAF创建的应用程序文件夹才能由用户授予访问权限。 - VGM
3
不可以。所有公共目录,例如DCIM、Pictures和Documents都是可选/可用的。只有Downloads不行。 - blackapps
1
@CommonsWare,您提到的所有公共文件夹都可以编写自己的文件(除了下载文件夹)。此外,可以在任何地方创建子文件夹。不需要使用SAF。 - blackapps
1
@blackapps 很好,谢谢你注意到这个问题。我刚刚进行了更多的测试,并使用一个文件夹管理应用程序创建了多个文件夹,我可以确认目前只有“下载”和根文件夹似乎无法正常工作。然而可能还有更微妙的问题,因为一些用户告诉我他们尝试授予该应用程序先前创建的文件夹(在Android 11上?)访问权限,但没有成功。这更加令人困惑,现在我知道了这个问题。我也想知道为什么Google将“下载”从中删除,因为它被广泛用于应用程序备份数据(这也是我使用它的原因)。 - VGM
显示剩余7条评论
1个回答

0
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;
        }

@VGM,你可以将“Android%2Fdata”替换为“Download”,就像这个链接https://dev59.com/mMDqa4cB1Zd3GeqPjbJP一样。 - thecr0w

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接