【发布时间】:2017-12-17 12:51:44
【问题描述】:
我想查询MediaStore 以获取设备上的所有照片,但仅限于相机拍摄的照片。请注意我试图在 照片 与设备上的任何其他图像媒体(下载、屏幕截图等)上做出的区别。 MediaStore 包含许多不同的目录或“桶”,默认的相机/图片位置就是其中之一。但是,这个存储桶的名称似乎没有任何标准——在我的索尼 Z5 上,它是“100ANDRO”,在我的三星 Galaxy S3 上,它只是“相机”。
阅读各种posts on StackOverflow,似乎这因制造商而异,但我应该能够在
找到常规“相机文件夹”的路径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 卡照片目录的路径似乎非常困难”——没有对您有用的可移动存储的文件系统路径。一般来说,您没有对可移动存储的任意文件系统访问权限。
-
是的。那么您如何看待我提出的方法,我试图解决没有路径的问题?
-
我没有尝试过这样的事情,所以我不知道它在现实中的表现如何。
-
我明白了。好吧,如果您对如何实现我想要实现的目标有一些提示(本质上,“只是”将所有照片加载到设备上),那么请告诉我。感谢您的反馈!
-
好吧,老实说......当我读到你问题的开头句时,我的第一反应是“没有可靠的方法来做到这一点”。您似乎为此做好了准备,例如您愿意忽略存储在意外位置的相机应用程序。但是,如果您的应用基本上找不到任何东西,因为他们的设备或相机应用的行为超出了您的预期,您的用户会理解这一点吗?
标签: android camera android-sdcard photos mediastore