跨Android供应商一致地从MediaStore加载照片(通过相机拍摄)

跨Android供应商一致地从MediaStore加载照片(通过相机拍摄),android,camera,android-sdcard,photos,mediastore,Android,Camera,Android Sdcard,Photos,Mediastore,我想在MediaStore中查询设备上的所有照片,但仅限于相机拍摄的照片。请注意,我试图将照片与设备上的任何其他图像媒体(下载、截图等)区别开来。MediaStore包含许多不同的目录或“bucket”,其中默认的摄像头/图片位置就是其中之一。然而,这个水桶的名字似乎没有任何标准——在我的索尼Z5上,它是“100ANDRO”,在我的三星Galaxy S3上,它只是“Camera” 阅读各种,这似乎是不同的制造商,但我应该能够找到路径的传统“相机文件夹”在 因此,我可以将查询过滤到该路径上的Med

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

阅读各种,这似乎是不同的制造商,但我应该能够找到路径的传统“相机文件夹”在

因此,我可以将查询过滤到该路径上的
MediaStore
(例如,S3上的
/storage/emulated/0/DCIM
)。如果用户选择将照片存储在一个完全非传统的位置,也许是使用第三方相机应用程序,那么就可以了。我只希望在这里介绍最“正常”的用例

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


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

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

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

  • 查询在此路径上筛选的
    MediaStore
    。找到相应的
    BUCKET\u DISPLAY\u NAME

  • 再次查询
    MediaStore
    ,在步骤2中的
    BUCKET\u DISPLAY\u NAME
    上过滤,路径与步骤2中的路径不同

  • 步骤2将在内存中查找所有照片。 步骤3将在SD卡上找到任何照片(如果有)。 如果没有安装卡,或者没有照片,步骤3将是空的,因此这似乎是一种相当优雅的方法

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


    您可以通过找到的链接中的代码实现这一点,这是您将找到的最佳解决方案,但是,正如其他人所说,您无法保证设备的摄像头应用程序实际上正在
    环境的目录中存储图片。directory\u DCIM
    ,甚至还有一个问题,其他应用程序也可能使用它来存储除图片以外的任何图像,因为它是公共的…

    “但是跨设备获取SD卡照片目录的路径似乎非常困难”——没有对您有用的可移动存储的文件系统路径。一般来说,您没有对可移动存储的任意文件系统访问权限。是的。那么,你对我提出的方法有什么看法,我试图绕过没有路径的问题?我还没有尝试过类似的方法,所以我不知道它在现实中的效果如何。我明白了。好吧,如果你对如何实现我的目标有一些建议(基本上,“只是”在设备上加载所有照片),那么请务必让我知道。谢谢你的反馈!老实说。。。当我读到你问题的开头一句时,我的第一反应是“没有可靠的方法可以做到这一点”。你似乎对此做好了准备,比如你愿意忽略存储在意外位置的相机应用程序。但是,如果你的应用程序基本上找不到任何东西,因为他们的设备或相机应用程序的行为超出了你的预期,你的用户会明白这一点吗?谢谢你的回复!我意识到在Android中这是一件很难做到的事情。然而,为了澄清这一点,以下是我想要做的。我想在设备上加载图像(最好是“照片”)。如果其他图像也出现了,那没关系。所以我想我应该只显示MediaStore中的所有图像,也许让用户过滤掉某些存储桶?此外,我正在编写的应用程序会更新JPEG文件(带有元数据)。如果图像恰好位于SD卡上,则我的应用程序将获得“权限拒绝”,即使它拥有
    WRITE\u EXTERNAL\u存储
    权限。我知道写SD卡(Android 4.4之后)需要一种与写内存完全不同的方法,这就是为什么我需要一种方法来区分内存中的图像和外部内存中的图像。事实上,我并没有料到会有这么复杂——但这也是挑战的一部分:这是一个很好的解决方法,只查询JPEG文件,然后让用户过滤掉他/她不希望更新的文件。
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)