【问题标题】:How to get persistent folder permission on Android 11?如何在 Android 11 上获得持久文件夹权限?
【发布时间】:2021-07-24 16:45:34
【问题描述】:

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

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 并以与扫描文件相同的方式处理它们。

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

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

【问题讨论】:

  • intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) 请删除这些标志。它们没有意义。
  • 对 Intent.ACTION_OPEN_DOCUMENT_TREE 获取的 uri 的处理在所有 Android 版本上都是相同的。您可以在 onAvtivityResult 中获取持久化 uri 权限。

标签: android scoped-storage


【解决方案1】:

为所选目录授予的权限将持续到用户的设备重新启动。要保留访问权限,您必须获得用户的许可。您可以在您的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

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2012-07-17
    • 2016-01-11
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多