Android: как обрабатывать фотографии «ограниченный доступ», чтобы получить координату ExifAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android: как обрабатывать фотографии «ограниченный доступ», чтобы получить координату Exif

Сообщение Anonymous »

Я строю приложение 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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