Я строю приложение Kotlin-Multiplatform. Ядро моего приложения полагается на наличие доступа к данным изображений с фото. Я попросил пользователей разрешение на read_media_images , что работает нормально, когда пользователь предоставляет доступ или отрицает его. Я использую блок ниже, чтобы обнаружить разрешение пользователя. < /P>
permissionLauncher.launch(permissionToRequest)
val permissionToRequest = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Manifest.permission.READ_MEDIA_IMAGES
} else {
Manifest.permission.READ_EXTERNAL_STORAGE
}
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = { isGranted: Boolean ->
if (isGranted) {
imagePickerLauncher.launch("image/*")
}
}
)
Проблема - это когда пользователь выбирает 3 -е опцию разрешить ограниченный доступ . Система выявляет собственный сборщик изображений. Если пользователь выбирает что -нибудь и нажимает «выполнен», блок OnResult выше работает с isgranted = true , который повторно запускал другой пикер ImagePickerLauncher.launch ("Image/*") . Если пользователь отклонит сборщика или не выберет ничего, и нажмите «Готово», то isgranted = false .
val imagePickerLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.GetMultipleContents(),
onResult = { uris: List ->
// handle images.
}
)
Я попытался следить за Запросить библиотеку устройств , которые возвращают URI для изображения, выбранного пользователями , но эти изображения не имеют координаты . есть ли способ представить только 2 варианта или , обработать это изящно ? Похоже, вариант ограниченного доступа приводит к ужасному потоку.
Небольшое редактирование: Координата существует при запросе библиотеки устройств , если manifest содержит read_media_visual_user_selected для некоторой причины. или полный доступ. Неясно, когда запрашивать библиотеку устройств < /em>, потому что, когда пользователь допускает полный доступ, запрос библиотеки возвращает все. val parsedUri = imageUri.toUri() // Using androidx.core.net.toUri
var tempFile: File? = null
try {
// Use androidContext which is now the correctly typed Android Context
tempFile = File.createTempFile("exif_image_", ".jpg", androidContext.cacheDir)
AppLogger.d(tag, "Created temp file: ${tempFile.absolutePath}")
androidContext.contentResolver.openInputStream(parsedUri)?.use { inputStream ->
FileOutputStream(tempFile).use { outputStream ->
inputStream.copyTo(outputStream)
AppLogger.d(tag, "Copied content to temp file: ${tempFile.absolutePath}")
}
} ?: run {
AppLogger.e(
tag,
"Failed to open input stream for URI: $imageUri. " +
"Temp file: ${tempFile.absolutePath}"
)
return@withContext null // Early exit; finally will clean up tempFile
}
val exifInterface =
ExifInterface(tempFile.absolutePath) // Using androidx.exifinterface.media.ExifInterface
val latLong = exifInterface.latLong
if (latLong == null || (latLong.size < 2) || (latLong[0] == 0.0 && latLong[1] == 0.0)) {
AppLogger.d(tag, "No valid LatLong found in EXIF data for ${tempFile.absolutePath}")
return@withContext null
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... coordinate
Android: как обрабатывать фотографии «ограниченный доступ», чтобы получить координату Exif ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение