在 Kotlin 上读取图像元数据

问题描述 投票:0回答:1

有没有办法使用 API 33 设备读取此类位置的图像元数据?我试图用“ExifInterface”来做到这一点,但我得到了 0.0 的纬度和 0.0 的经度。该图像具有元数据。

这是从图像Uri中提取LatLng的函数

fun readLocationMetadata(context: Context, imageUri: Uri): LatLng? {
try {
    val inputStream = context.contentResolver.openInputStream(imageUri)
    inputStream?.use { stream ->
        val exifInterface = ExifInterface(stream)
        val latitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE)
        val latitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF)
        val longitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE)
        val longitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF)
        println(latitude + " " + latitudeRef + " " + longitude + " " + longitudeRef)
    }
} catch (e: Exception) {
    e.printStackTrace()
}
return null

}

这是我调用该函数的地方,你可以看到我之前要求 READ_MEDIA_IMAGES 。

val requestPermissionLauncher =
    rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission(),
        onResult = { }
    )
val multiplePhotoPickerLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.PickMultipleVisualMedia(maxItems = MAX_IMAGES_SELECTED),
    onResult = { uris ->
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            requestPermissionLauncher.launch(android.Manifest.permission.READ_MEDIA_IMAGES)
            val hasMetadataLocation = readLocationMetadata(context, uris.first())
            if (hasMetadataLocation != null) {
                viewModel.onEvent(AddSpotUIEvent.UpdateSpotLocation(hasMetadataLocation))
            }
        }
        viewModel.onEvent(AddSpotUIEvent.UpdateSelectedImages(uris))
    }
)

有人可以帮助我吗?谢谢!! :)

android image kotlin android-jetpack-compose metadata
1个回答
0
投票

如果您可以使用API,这里有一个使用ApyHub的图像元数据API的简单集成代码

import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.asRequestBody

val client = OkHttpClient()

val requestBody = MultipartBody.Builder()
  .setType(MultipartBody.FORM)
  .addFormDataPart("image", "image-name.png", File("image-file -path").asRequestBody())
  .build()

val request = Request.Builder()
  .url("https://api.apyhub.com/processor/image/metadata/file")
  .post(requestBody)
  .header("apy-token", "YOUR-APY-SECRET-TOKEN")
  .header("content-type", "multipart/form-data")
  .build()

client.newCall(request).execute().use { response ->
  if (!response.isSuccessful) throw IOException("Unexpected code $response")
  response.body!!.string()
}

您可以从

这里
生成apy-token

© www.soinside.com 2019 - 2024. All rights reserved.