Сохранение разрешений URI с использованием takePersistableUriPermission не работает в Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Сохранение разрешений URI с использованием takePersistableUriPermission не работает в Jetpack Compose

Сообщение Anonymous »

Я пытаюсь сохранить файл во внешнем хранилище и для этого использую ACTION_OPEN_DOCUMENT_TREE.
Все работает нормально, моя проблема в том, что он запрашивает разрешение на доступ к выбранной папке каждый раз, когда пользователь выбирает папку. Я хочу, чтобы пользователь мог каждый раз выбирать любую папку, но если он уже предоставил моему приложению разрешение на доступ к папке, я не хочу, чтобы ему снова запрашивали разрешение.
Мой код:

Код: Выделить всё

val saveToDevicePickFolderLauncher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri ->
uri?.let {
try {
App.instance.contentResolver.takePersistableUriPermission(it, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Logger.i { "Permissions persisted for URI: $it" }
} catch (e: SecurityException) {
Logger.e { "Failed to take persistable URI permission: ${e.localizedMessage}" }
}
viewModel.saveToDevice(selectedFileList, it, context)
toggleSelectMode(on = false)
}
}
Затем при отладке я проверил все возможное при запуске ActivityResultLauncher:

Код: Выделить всё

saveFileListToDevice = { list ->

val persistedUriPermission = App.instance.contentResolver.persistedUriPermissions.firstOrNull()
val persistedUri: Uri? = persistedUriPermission?.uri
Logger.i { "Retrieved persisted URI $persistedUri with read? ${persistedUriPermission?.isReadPermission} and write? ${persistedUriPermission?.isWritePermission} permissions" }

if (persistedUri != null) {
try {
// Ensure persistable URI permissions are granted for the persisted URI
App.instance.contentResolver.takePersistableUriPermission(
persistedUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
Logger.i { "Permissions persisted for URI: $persistedUri" }
} catch (e: SecurityException) {
Logger.i { "Failed to take persistable URI permission: ${e.localizedMessage}" }
}

// Check if external storage is mounted and accessible
when (val storageState = Environment.getExternalStorageState(File(persistedUri.path))) {
Environment.MEDIA_MOUNTED -> {
Logger.i { "External storage is mounted and writable." }
}
Environment.MEDIA_MOUNTED_READ_ONLY -> {
Logger.i { "External storage is mounted, but read-only." }
}
Environment.MEDIA_UNMOUNTED, Environment.MEDIA_REMOVED -> {
Logger.i { "External storage is not available." }
}
else -> {
Logger.i { "Unknown state for external storage: $storageState" }
}
}

val documentFile = DocumentFile.fromTreeUri(context, persistedUri)
if (documentFile != null && documentFile.exists()) {
// The URI is valid and the document exists
Logger.i { "Document exists or URI is VALID" }
saveToDevicePickFolderLauncher.launch(persistedUri)
} else {
Logger.i { "Document does not exist or URI is invalid" }
saveToDevicePickFolderLauncher.launch(null)
}
} else {
Logger.i { "Opening for input null" }
saveToDevicePickFolderLauncher.launch(null)
}
},
Я получаю следующие журналы:

Код: Выделить всё

Permissions persisted for URI: content://com.android.externalstorage.documents/tree/primary%3ADownload%2FA
Retrieved persisted URI UriPermission {uri=content://com.android.externalstorage.documents/tree/primary%3ADownload%2FA, modeFlags=3, persistedTime=1732635607603} with read? true and write? true permissions
Permissions persisted for URI: content://com.android.externalstorage.documents/tree/primary%3ADownload%2FA
Unknown state for external storage: unknown
Document exists or URI is VALID
Permissions persisted for URI: content://com.android.externalstorage.documents/tree/primary%3ADownload%2FA
Я также пытался сохранить URI в SharedPreferences, но это не имеет значения.
На данный момент мои контрольные точки:
1. Проверено, что takePersistableUriPermission() вызывается правильно как при выборе папки, так и при доступе к ней. ✅
2. Проверены постоянные URI с помощью contentResolver.persistedUriPermissions, чтобы убедиться, что разрешения на чтение и запись предоставлены. ✅
3. Проверено, действителен ли URI, с помощью DocumentFile.fromTreeUri(). ✅
4.Проверил состояние внешнего накопителя, но получил состояние Неизвестно ❌ в чем может быть причина, не понимаю, что тут можно сделать?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ing-in-jet
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»