检测Android摄像头文件夹
我想检测每个安卓设备上的摄像头文件夹。据我所知,此文件夹因制造商而异,无法保证设备上会有DCIM文件夹 这是我现在用来获取文件的方法:检测Android摄像头文件夹,android,camera,directory,Android,Camera,Directory,我想检测每个安卓设备上的摄像头文件夹。据我所知,此文件夹因制造商而异,无法保证设备上会有DCIM文件夹 这是我现在用来获取文件的方法: private static final Set<String> FILTER_FOLDERS = new HashSet<String>( Arrays.asList(new String[] { "camera", "100andro", "100media" })); private Set<String&
private static final Set<String> FILTER_FOLDERS = new HashSet<String>(
Arrays.asList(new String[] { "camera", "100andro", "100media" }));
private Set<String> getCameraPictures() {
final String[] columns = new String[] {
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.MIME_TYPE };
// Order by options - by date & descending
final String orderBy = MediaStore.Images.ImageColumns.DATE_TAKEN
+ " DESC";
// Stores all the images from the gallery in Cursor
final Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // base URI for
// the Images
columns, // Which columns to return
null, // Which rows to return (all rows)
null, // Selection arguments (none)
orderBy); // Ordering
// Total number of images
int count = cursor.getCount();
// Create an array to store path to all the images
String[] picturesPath = new String[count];
if (cursor.moveToFirst()) {
int dataColumn = cursor
.getColumnIndex(MediaStore.Images.Media.DATA);
int bucketColumn = cursor
.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
do {
if (FILTER_FOLDERS.contains(cursor.getString(bucketColumn)
.toLowerCase(Locale.getDefault()))) {
// Store the path of the image
picturesPath[cursor.getPosition()] = cursor
.getString(dataColumn);
}
} while (cursor.moveToNext());
}
// Close the cursor
if (null != cursor) {
cursor.close();
}
return new HashSet<String>(Arrays.asList(picturesPath));
}
private static final Set FILTER\u FOLDERS=new HashSet(
asList(新字符串[]{“camera”、“100andro”、“100media”});
私有集getCameraPictures(){
最终字符串[]列=新字符串[]{
MediaStore.Images.ImageColumns.\u ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET\u显示\u名称,
MediaStore.Images.ImageColumns.DISPLAY\u名称,
MediaStore.Images.ImageColumns.DATE_拍摄日期,
MediaStore.Images.ImageColumns.MIME_TYPE};
//按选项排序-按日期和降序
最终字符串orderBy=MediaStore.Images.ImageColumns.DATE\u
+“描述”;
//将库中的所有图像存储在光标中
最终游标游标=getContentResolver().query(
MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI,//的基本URI
//图像
columns,//返回哪些列
null,//返回哪些行(所有行)
null,//选择参数(无)
orderBy);//排序
//图像总数
int count=cursor.getCount();
//创建一个数组来存储所有图像的路径
字符串[]图片路径=新字符串[计数];
if(cursor.moveToFirst()){
int dataColumn=游标
.getColumnIndex(MediaStore.Images.Media.DATA);
int bucketColumn=光标
.getColumnIndex(MediaStore.Images.Media.BUCKET\u DISPLAY\u NAME);
做{
if(FILTER_FOLDERS.contains)(cursor.getString(bucketColumn))
.toLowerCase(Locale.getDefault())){
//存储图像的路径
picturesPath[cursor.getPosition()]=光标
.getString(数据列);
}
}while(cursor.moveToNext());
}
//关闭光标
如果(null!=光标){
cursor.close();
}
返回新的HashSet(Arrays.asList(picturesPath));
}
但这也是从其他地方返回的图像。。。
如何仅检索使用相机拍摄的图像?
如果没有本机方法,我在哪里可以找到每个制造商使用的文件夹的名称(尽可能多),以便我可以通过BUCKET\u DISPLAY\u NAME对其进行筛选
多谢各位
乐:
我已经更新了在设备上获取图像的方法,并对文件夹进行了筛选。设备附带了几十个,甚至数百个摄像头应用程序,还有数千个摄像头应用程序可供下载。没有人必须使用特定的“照相机文件夹”,也没有人必须通过
MediaStore
对其图像进行索引
设备的常规“摄像头文件夹”将位于环境.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM)
指定的位置。如果没有摄像头应用程序使用该目录,则该目录可能还不存在。但是,同样,相机应用程序不需要使用它——他们可以在任何地方存储自己的图像,包括你无法访问的地方(例如,内部存储,“云”)
如何仅检索使用相机拍摄的图像
你不能。地球上有超过10亿部智能手机,任何手机都可以通过照片共享应用程序和网站上的任何摄像头从任何其他手机上拍摄照片。这是由智能手机以外的照相机拍摄的照片。为了您的利益,无需指定设备自带摄像头拍摄的图像。我认为应该有一些方法来实现这一点。至少覆盖了大部分设备。我正在考虑云应用程序,它具有自动备份照片的功能,并且只备份使用设备摄像头拍摄的照片。。。如果你有什么好的建议:)。。。感谢you@IonutNegru:“至少要覆盖大多数设备”--这将是
环境.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM)
,正如我在回答的第二段中所指出的。我尝试了使用它,我使用的方法得到了相同的结果。。。。它包括其他不是用相机拍摄的图像。。。现在我通过检查一些硬编码的文件夹名称来过滤它们,比如“camera”或“100andro”…但这只是暂时的,直到我找到一个更可靠的解决方案。。。明天我将用新方法更新我的代码。。。不过,谢谢你的回答和宝贵的时间@IonutNegru:“它包括其他未使用相机拍摄的图像”——任何应用程序都可以将图像放入该文件夹。我选择从该设备获取所有图像,因为没有安全的方法仅检测使用相机应用程序拍摄的图像@Commonware我将标记您的答案为正确,因为它向我展示并解释了所有问题以及一些检测图像的方法。非常感谢。