有没有办法使用 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))
}
)
有人可以帮助我吗?谢谢!! :)
如果您可以使用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
。