如何在 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)
我的应用程序扫描特定目录中的文本文件。用户可以点击按钮添加目录:
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)