一致地从 Android 供应商的 MediaStore 加载照片(由相机拍摄)

Posted

技术标签:

【中文标题】一致地从 Android 供应商的 MediaStore 加载照片(由相机拍摄)【英文标题】:Consistently load photos (taken by camera) from MediaStore, across Android vendors 【发布时间】:2017-12-17 12:51:44 【问题描述】:

我想查询MediaStore 以获取设备上的所有照片,但仅限于相机拍摄的照片。请注意我试图在 照片 与设备上的任何其他图像媒体(下载、屏幕截图等)上做出的区别。 MediaStore 包含许多不同的目录或“桶”,默认的相机/图片位置就是其中之一。但是,这个存储桶的名称似乎没有任何标准——在我的索尼 Z5 上,它是“100ANDRO”,在我的三星 Galaxy S3 上,它只是“相机”。

阅读各种posts on ***,似乎这因制造商而异,但我应该能够在

找到常规“相机文件夹”的路径
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

所以我可以将查询过滤到该路径上的MediaStore(例如,我的 S3 上的/storage/emulated/0/DCIM)。如果用户选择将照片存储在一个完全不同寻常的位置,也许使用第三方相机应用程序,那没关系。我只希望在这里涵盖最“正常”的用例。

但如果我还想将照片加载到外部 SD 卡(如果有)上怎么办?

据我所知,“内存”上的照片和 SD 卡上的照片在MediaStore 中将具有相同的BUCKET_DISPLAY_NAME(和BUCKET_ID)。但是,跨设备获取 SD 卡照片目录的 路径 似乎非常困难。

那么您如何看待这种方法(获取所有照片):

    找到“相机文件夹”路径(如上)

    查询MediaStore,在此路径上过滤。找到对应的BUCKET_DISPLAY_NAME

    再次查询MediaStore,在第 2 步中对 BUCKET_DISPLAY_NAME 进行过滤,并且路径与第 2 步中的路径不同。

第 2 步将找到内存中的所有照片。 第 3 步将找到 SD 卡上的所有照片(如果存在)。 如果没有挂载卡,或者没有照片,第 3 步将是空的,所以这可能看起来是一种相当优雅的方法。

【问题讨论】:

“但是跨设备获取 SD 卡照片目录的路径似乎非常困难”——没有对您有用的可移动存储的文件系统路径。一般来说,您没有对可移动存储的任意文件系统访问权限。 是的。那么您如何看待我提出的方法,我试图解决没有路径的问题? 我没有尝试过这样的事情,所以我不知道它在现实中的表现如何。 我明白了。好吧,如果您对如何实现我想要实现的目标有一些提示(本质上,“只是”将所有照片加载到设备上),那么请告诉我。感谢您的反馈! 好吧,老实说......当我读到你问题的开头句时,我的第一反应是“没有可靠的方法来做到这一点”。您似乎为此做好了准备,例如您愿意忽略存储在意外位置的相机应用程序。但是,如果您的应用基本上找不到任何东西,因为他们的设备或相机应用的行为超出了您的预期,您的用户会理解这一点吗? 【参考方案1】:

所以我可以将查询过滤到该路径上的 MediaStore(例如,我的 S3 上的 /storage/emulated/0/DCIM

您可以使用您找到的链接中的代码来实现这一点,这是您会找到的最佳解决方案,但是,就像其他人所说的那样,您无法保证设备的相机应用程序实际上将图片存储在 @ 的目录中987654323@,甚至还有其他应用程序也可能使用它来存储除图片以外的任何图像的问题,因为它是公开的......

【讨论】:

感谢您的回复!我意识到这在 android 中是一件困难的事情。但是,为了澄清,这就是我想要做的。我想在设备上加载图像(最好是“照片”)。如果其他图像也出现,那没关系。所以我想我应该只显示 MediaStore 中的所有图像,也许让用户过滤掉某些存储桶? 此外,我正在编写的应用程序会更新 JPEG 文件(带有元数据)。如果图像恰好位于 SD 卡上,那么即使我的应用程序拥有 WRITE_EXTERNAL_STORAGE 权限,它也会获得“权限被拒绝”。我知道写入 SD 卡(在 Android 4.4 之后)需要一种与写入内部存储器完全不同的方法,这就是为什么我需要一种方法来区分内部存储器上的图像和外部存储器上的图像。实际上,我并没有预料到所有这些复杂性——但这都是挑战的一部分:D 这是一个很好的解决方法,只查询JPEG文件,然后让用户过滤掉他/她不想更新的文件。

以上是关于一致地从 Android 供应商的 MediaStore 加载照片(由相机拍摄)的主要内容,如果未能解决你的问题,请参考以下文章

Android API Guides---Storage Access Framework

Android有效地从输入流中读取

如何有效地从 Android 上的资源中获取短数组?

Android 集成Flutter

Android 拍照 引发 “SecurityException has no access to content://media/...“

Android 拍照 引发 “SecurityException has no access to content://media/...“