Я строю приложение 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
}
< /code>
Manifest разрешение < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... coordinate
Android: как обрабатывать фотографии «ограниченный доступ», чтобы получить координату Exif ⇐ Android
Форум для тех, кто программирует под Android
1755651586
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/*")
}
}
)
[b] Проблема [/b] - это когда пользователь выбирает 3 -е опцию [b] разрешить ограниченный доступ [/b]. Система выявляет собственный сборщик изображений. Если пользователь выбирает что -нибудь и нажимает «выполнен», блок OnResult выше работает с isgranted = true , который повторно запускал другой пикер ImagePickerLauncher.launch ("Image/*") . Если пользователь отклонит сборщика или не выберет ничего, и нажмите «Готово», то isgranted = false .
val imagePickerLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.GetMultipleContents(),
onResult = { uris: List ->
// handle images.
}
)
Я попытался следить за [b] Запросить библиотеку устройств [/b], которые возвращают URI для изображения, выбранного пользователями , но эти изображения не имеют координаты . [b] есть ли способ представить только 2 варианта [/b] или [b], обработать это изящно [/b]? Похоже, вариант ограниченного доступа приводит к ужасному потоку.
[b] Небольшое редактирование: [/b] Координата существует при запросе библиотеки устройств [b], если [/b] 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
}
< /code>
Manifest разрешение < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79739293/android-how-to-handle-limited-access-photos-to-get-exif-coordinate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия