Все работает нормально, моя проблема в том, что он запрашивает разрешение на доступ к выбранной папке каждый раз, когда пользователь выбирает папку. Я хочу, чтобы пользователь мог каждый раз выбирать любую папку, но если он уже предоставил моему приложению разрешение на доступ к папке, я не хочу, чтобы ему снова запрашивали разрешение.
Мой код:
Код: Выделить всё
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)
}
}
Код: Выделить всё
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
На данный момент мои контрольные точки:
1. Проверено, что takePersistableUriPermission() вызывается правильно как при выборе папки, так и при доступе к ней.
2. Проверены постоянные URI с помощью contentResolver.persistedUriPermissions, чтобы убедиться, что разрешения на чтение и запись предоставлены.
3. Проверено, действителен ли URI, с помощью DocumentFile.fromTreeUri().
4.Проверил состояние внешнего накопителя, но получил состояние Неизвестно
Подробнее здесь: https://stackoverflow.com/questions/792 ... ing-in-jet