Android 11如何获取持久文件夹权限?

Iva*_*lov 2 android scoped-storage

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

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)
Run Code Online (Sandbox Code Playgroud)

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

在 Android API 28 上,存储的 URI 工作正常。在 Android API 30 上,SecurityException如果我在应用程序重新启动后尝试访问其中任何一个,我会收到一个错误消息。

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

Alp*_*a 1 8

为所选目录授予的权限将持续到用户设备重新启动为止。要保留访问权限,您必须获得用户的许可。您可以在您的方法中请求许可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)
Run Code Online (Sandbox Code Playgroud)

更多详情请点击此处