如何在 Android 11 上获得永久文件夹权限?

How to get persistent folder permission on Android 11?

我的应用程序扫描特定目录中的文本文件。用户可以点击按钮添加目录:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivityForResult(intent, RESULT_CODE_DOCUMENT_TREE)

然后我将 URI 存储在数据库中并使用 DocumentsContract 扫描目录中的文件并读取它们。在应用程序启动时,我加载存储的 URI 并以相同的方式处理它们以扫描文件。

On Android API 28 存储的 URI 工作正常。在 Android API 30 上,如果我在应用程序重启后尝试访问它们中的任何一个,我会得到一个 SecurityException

有没有办法让这些权限在现代 Android 上持久存在?或者我应该采用完全不同的方法?

为所选目录授予的权限持续到用户的设备重新启动。要保留访问权限,您必须获得用户的许可。您可以在 onActivityResult 方法中请求许可,请参见下面的示例:

val contentResolver = applicationContext.contentResolver

val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
        Intent.FLAG_GRANT_WRITE_URI_PERMISSION
// Check for the freshest data.
contentResolver.takePersistableUriPermission(uri, takeFlags)

More details here