今天写了一个查询图片信息的方法,才知道android中的所有媒体信息都被android保存到数据库里了。
android系统每次加载SDCARD的时候都会扫描SDCARD把sdcard中的多媒体,文件信息等等信息保存在数据库中。
我们先看一下数据库文件保存的目录 /data/data/com.android.providers.media/databases,在这个目录里有一个数据库文件
打开数据库,就可以看到android按着不同的数据类型给我们分成了不同的表,有image、video、auto_meta等等。
android为我们提供了很好的方法查询数据库:
ContentResolver myResolver=this.context.getContentResolver();
Cursor cursor=myResolver.query(uri, projection, selection, selectionArgs, sortOrder);
示例代码:
/**
* 根据文件名查看图像信息,返回查询结果,包括文件路径、大小、文件名、类型、标题(文件名无扩展名)、父文件名
* @param display_name 文件名 例:pic.png
* @return 如果查询结果为空则返回null,否则返回一个ArrayList<Map<String,String>>类型数据,Map键名依次为date、size、display_name、mime_type、title、bucket_display,也可以直接使用常量ConstantFactory.ImageAbout.DATE等。
*
*/
public ArrayList<Map<String,String>> getImageInformationForDisplayName(String display_name){
ContentResolver myResolver=this.context.getContentResolver();
Cursor cursor=myResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, "_display_name=?", new String[]{display_name}, null);
if(cursor.getCount()==0){
return null;
}
cursor.moveToFirst();
ArrayList<Map<String,String>> list=new ArrayList<Map<String,String>>();
Map<String, String> map=resolutionCursor(cursor);
for(int i=0;i<cursor.getCount();i++){
map=resolutionCursor(cursor);
list.add(map);
cursor.moveToNext();
}
return list;
}
/*
* 解析cursor获得其中数据
*/
private Map<String, String> resolutionCursor(Cursor cursor){
Map<String, String> map =new HashMap<String, String>();
// cursor.moveToPosition(23);
// this.string=cursor.getColumnNames();
// for(int i=0;i<string.length;i++){
// System.out.println(string[i]);
// //System.out.println(cursor.getColumnIndex(string[i]));
// System.out.println(""+cursor.getString(cursor.getColumnIndex(string[i])));
// }
//
// System.out.println(""+cursor.getString(cursor.getColumnIndex("_data"))+"\n"+ cursor.getString(cursor.getColumnIndex("_size"))
// +"\n"+cursor.getString(cursor.getColumnIndex("_display_name"))+"\n"+cursor.getString(cursor.getColumnIndex("mime_type"))
// +"\n"+cursor.getString(cursor.getColumnIndex("title"))+"\n"+cursor.getString(cursor.getColumnIndex("bucket_display_name")));
//具体的文件地址/sdcard/tencent/MobileQQ/head/511079108.png
map.put(ConstantFactory.ImageAbout.DATA, cursor.getString(cursor.getColumnIndex("_data")));
//文件大小
map.put(ConstantFactory.ImageAbout.SIZE, cursor.getString(cursor.getColumnIndex("_size")));
//文件名称(包含扩展名)
map.put(ConstantFactory.ImageAbout.DISPLAY_NAME, cursor.getString(cursor.getColumnIndex("_display_name")));
//文件类型
map.put(ConstantFactory.ImageAbout.MIME_TYPE, cursor.getString(cursor.getColumnIndex("mime_type")));
//文件标题(文件名没有标题)
map.put(ConstantFactory.ImageAbout.TITLE, cursor.getString(cursor.getColumnIndex("title")));
//父文件夹名
map.put(ConstantFactory.ImageAbout.BUCKET_DISPLAY, cursor.getString(cursor.getColumnIndex("bucket_display_name")));
return map;
}
1、SD卡中的所有缩略图可以通过MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI来得到
2、MediaStore.Images.Media.EXTERNAL_CONTENT_URI来得到原始图片