【问题标题】:EXIF location data removed when sharing photo via Intent通过 Intent 共享照片时删除 EXIF 位置数据
【发布时间】:2021-07-19 14:23:28
【问题描述】:

我最近将我的应用程序切换到了 Scoped Storage。但是,我注意到当我从应用程序内(通过 Intent)共享图像时,GPS 位置数据会从图像的 Exif 元数据中删除。我知道 Scoped Storage 对访问图像的 Exif 位置数据有一些限制,并且我知道权限 <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />,但是在共享图像时添加此权限似乎没有任何效果。知道如何通过 Intent 共享图像,同时将位置数据保留在图像的 Exif 数据中吗?

这是我的代码:

 val imageUri = mediaList[photo_view_pager.currentItem].uri

 val intent = Intent().apply {
     val mediaType = MimeTypeMap.getSingleton()
        .getMimeTypeFromExtension("jpg")
     putExtra(Intent.EXTRA_STREAM, imageUri)
     type = mediaType
     action = Intent.ACTION_SEND
     flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
 }

 startActivity(Intent.createChooser(intent, getString(R.string.share_hint)))

非常感谢您的任何帮助!

【问题讨论】:

  • 是不是因为你提前感谢了,没有人反应?你最好把它去掉。不过你的问题很有趣。
  • 如果你的应用自己打开文件,它可以读取纬度和经度吗?
  • 是的,我的应用程序可以使用 ACCESS_MEDIA_LOCATION 权限 MediaStore.setRequireOriginal(photoUri) 和内容解析器读取文件的位置,但是共享时该位置仍不包含在照片中。我还尝试将用于共享的初始 Uri 修改为photoUri = MediaStore.setRequireOriginal(photoUri),但这会导致照片无法加载到第三方消息应用程序中或导致崩溃。
  • photoUri = MediaStore.setRequireOriginal(photoUri) 您是在服务应用程序中这样做的吗?您是否也尝试过接收应用程序?
  • 我认为服务应用程序是我的应用程序,而接收应用程序是 Gmail 应用程序、WhatsApp 或任何其他消息传递应用程序。请纠正我,以防我弄错了。我在服务应用程序(我的应用程序)中尝试了它。接收应用程序似乎无法识别修改后的 Uri。我尝试了几个应用程序:Gmail 没有正确加载图像,而 ProtonMail 根本没有加载图像。 Signal Messenger 崩溃。

标签: android android-intent geolocation mediastore scoped-storage


【解决方案1】:

我在 Android 11 上的体验。

也必须在运行时请求 ACCESS_MEDIA_LOCATION。

服务应用应具有“所有文件访问权限”,以便接收应用从 exif 读取纬度、经度。

如果服务应用程序可以访问所有文件,则不需要 MediaStore.setRequireOriginal 从文件中读取 lat,lon 本身。

(我从未使用过 MediaStore.setRequireOriginal,但现在将进行调查)。

【讨论】:

  • 谢谢!我也会继续调查。仅供参考,我的应用程序没有“所有文件访问权限”。这是一个相机应用程序,我不确定是否可以证明使用它(该应用程序在 Google Play 上,我需要提交使用“所有文件访问”的特殊请求)。值得一提的是,该应用只访问它创建的照片。
  • 我已经尝试了所有可能的权限组合(所有文件访问、ACCESS_MEDIA_LOCATION、...),但还没有运气(在 Android 10 上)。我注意到,虽然通过 Gmail 共享照片会删除位置 Exif 数据,但通过 Google Drive 共享它会保留它(即使没有 ACCESS_MEDIA_LOCATION 和所有文件访问权限)。因此,接收应用程序似乎也会影响它,但想知道是否有办法从服务应用程序影响它(可能在 Intent 中有一个标志)......
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多