Постоянные разрешения URI с использованием TakePersistableUripermission не работают в JetPack ComposeAndroid

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

Сообщение Anonymous »

Я Тринг, чтобы сохранить файл на внешнее хранилище, и для этого я использую action_open_document_tree < /code>.
Все работает нормально, моя проблема заключается в том, что он запрашивает разрешение на доступ к выбранной папке каждый раз, когда пользователь выбирает папку. Я хочу, чтобы пользователь мог выбрать любую папку, которую они хотят каждый раз, но если он уже давал мое разрешение на приложение для доступа к папке, я не хочу, чтобы их снова было предложено для разрешения.

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

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)
}
},
< /code>
Журналы, которые я получаю: < /p>
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
< /code>
Я также пытался сохранить URI для SharedPreferences, но это не имеет значения.
Мои контрольные точки до сих пор: < /p>
1.Verifified, что TakePersistableUripermission () правильно называется как при выборе, так и при доступе к папке. ✅ < /p>
2. Проверка устойчивая URI с использованием ContentReSolver. ✅ < /p>
3.3.3. заправить, если URI все еще действителен с помощью documentFile.fromTreeuri (). ✅
4.4. Провернул внешнее состояние хранения, но получило неизвестное состояние ❌ Что может быть причиной для этого, я не понимаю, что я могу здесь сделать?

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

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

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

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

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

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

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