Получение данных GPS EXIF ​​​​из изображений с помощью AndroidX ExifInterface?

Я ориентируюсь на Android 13 и использую новое средство выбора фотографий для извлечения изображений. Например

      val photoPicker = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.PickMultipleVisualMedia()
    ) { uris: List<Uri> -> handleUris(context, uris) ) }) }

photoPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))

fun handleUris(context: Context, uris: List<Uri>) {
    for (uri in uris) {
        context.contentResolver.openInputStream(uri)!!.use { stream ->
            ExifInterface(stream).let { exif ->
                val dateTime = exif.dateTime // present
                val latLng = exif.latLong // always null
            }
        }
    }
}

Что я нашел:

Поскольку информация GPS Android 10 больше не включается в данные EXIF ​​при извлечении мультимедиа. Согласно этому видео от 2019 года, вам необходимо запросить разрешение на выполнение.

Они объясняют, что это разрешение времени выполнения, но пользователь не может видеть разрешение в системных настройках (что само по себе довольно странно). Они также утверждают, что вам нужно разрешение на доступ к СМИ.

также говорится о разрешении на размещение носителя.

Запрос разрешения с помощью:

      val locationPermissionState = rememberPermissionState(
        permission = ACCESS_MEDIA_LOCATION
)
locationPermissionState.launchPermissionRequest()

На самом деле это приводит к появлению диалогового окна разрешения с запросом «Приложение для доступа к фотографиям и видео на этом устройстве». Однако при предоставлении данных о местоположении EXIF ​​все еще нет.

Ах, верно. Судя по видео нам тоже нужно.

      val locationPermissionState = rememberMultiplePermissionsState(
        permissions = listOf(ACCESS_MEDIA_LOCATION, READ_EXTERNAL_STORAGE)
)

Диалоговое окно не отображается. проверка с помощьюContextCompat.checkSelfPermission()кажется, у нас есть разрешение, но нет. Почему он не показывает диалог для этого?

Глядя на документы для Android 13, кажется, что они заменены более детальными разрешениями.

Похоже, что при нацеливании на Android 13 вы больше не должны использовать это разрешение. Для изображений нам нужноREAD_MEDIA_IMAGESвместо. Но при запросе этого разрешения диалоговое окно также не отображается.

Я также попробовал API, который должен предотвратить редактирование метаданных EXIF, согласно документам, это вызываетUnsupportedOperationExceptionкогда у вас нет разрешения. Но для меня это бросает сообщениеCalling uid does not have permission to access picker uri: content://etc.

Итак, как мне получить местоположение GPS в данных EXIF; какие разрешения мне действительно нужны и как их запросить?

РЕДАКТИРОВАТЬ:

Итак, на Android 11, когда средство выбора фотографий недоступно, оно используетIntent(Intent.ACTION_OPEN_DOCUMENT)вместо этого внутренне. Uri, возвращаемый из этого, выглядит следующим образом:content://com.android.providers.media.documents/document/image%3A283

Я могу получить позицию GPS из этого uri БЕЗ предоставленияACCESS_MEDIA_LOCATION,READ_MEDIA_IMAGEилиREAD_EXTERNAL_STORAGEразрешения. В отличие от большей части документации, которую я смог найти. Также нетMediaStore.setRequireOriginal(Uri)необходим.

Что заставляет меня думать, что это проблема выбора фотографий, а не проблема с разрешениями. Поэтому я решил протестировать Android 13 без использования средства выбора фотографий.

я использую

      val photoPicker = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.GetContent()
) { uri: Uri? ->  }

Вместо этого сейчас, который используетIntent(Intent.ACTION_GET_CONTENT)внутри. Ури выглядит такcontent://com.android.providers.media.documents/document/image%3A1000000049и снова я могу извлекать данные GPS без каких-либо вышеупомянутых разрешений и без .

Что позволяет мне сделать вывод, что В этой части документациидокументы о местоположении мультимедиа неверны ... разрешение не требуется (если только они не говорят о других метаданных, кроме широты/долготы). И должно быть что-то происходит с новым uri для выбора фотографий, что приводит кSecurityExceptionкогда используешьsetRequireOriginalи/или редактирование данных exif. Является ли это ожидаемым поведением, я пока не знаю.

0 ответов