Android—获取相册中的相片
利用的组件ContentProvider
项目要求:获取未读取的图片
入参:context
出参:图片的地址,图片的信息map列表
思路:用sharedPreference存储image的id,然后在获取图片时读取上次取得id,然后取数据的时候大于id的就取出。
private String getLastId(){
SharedPreferences spf = context.getSharedPreferences("imageInfo", Context.MODE_PRIVATE);
String id = spf.getString("imageId","0");
return id;
}
private void saveNewId(String lastId){
SharedPreferences spf = context.getSharedPreferences("imageInfo",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = spf.edit();
editor.putString("imageId",lastId);
editor.commit();
}
通过图片应用的ContentProvider读取数据,这里读取其他应用的数据,需要实例化ContentResolver对象,然后根据应用提供的地址query相应的数据,获取的数据根据Cursor指针进行逐个读取。
获取了基本很多信息
id,数据的独立标识
MediaStore.Images.Media._IDtitle,图片的名称(根据相册存储的命名来的)
MediaStore.Images.Media.TITLEmime,数据的mime类型(image/png,image/jepg,image/gif)
MediaStore.Images.Media.MIME_TYPElat,经度
MediaStore.Images.ImageColumns.LATITUDElon,纬度
MediaStore.Images.ImageColumns.LONGITUDEdate,时间
MediaStore.Images.ImageColumns.DATE_TAKENbucket,相册
MediaStore.Images.Media.BUCKET_DISPLAY_NAMEpath,文件路径,此处需要处理一下方便通过地址获取文件
MediaStore.Images.Media.DATA
我的项目中是在其他函数中调用的
//其他函数中调用
ContentResolver resolver = context.getContentResolver();
ArrayList<Map<String,Object>> list = getGalleryPhotos(resolver);
实际获取的函数
private ArrayList<Map<String,Object>> getGalleryPhotos(ContentResolver resolver){
ArrayList<Map<String,Object>> content = new ArrayList<>();
try {
String lastId = getLastId();
//获取所在相册和相册id
final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID,};
//按照id排序
final String orderBy = MediaStore.Images.Media._ID;
//根据id筛选
final String selection = MediaStore.Images.Media._ID + ">" + lastId;
//相当于sql语句默认升序排序orderBy,如果降序则最后一位参数是是orderBy+" desc "
Cursor imagecursor =
resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, selection,
null, orderBy);
//从数据库中取出图存入list集合中
imagecursor.moveToFirst();
if (imagecursor != null && imagecursor.getCount() > 0) {
while (imagecursor.moveToNext()) {
Map<String,Object> photo = new HashMap<String, Object>();
//String id = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media._ID));
String title = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.TITLE));
String path = "file://" + imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.DATA));
//photo.put("id",id);
photo.put("title",title);
photo.put("path",path);
content.add(photo);
}
imagecursor.moveToLast();
saveNewId(imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media._ID)));
//记得关闭cursor
imagecursor.close();
}
}catch (Exception e) {
e.printStackTrace();
}
// 存储尽量按照顺序新的放在最前,旧的放在最后,这样,每次获取的图片最终排在一起也是按顺序的
Collections.reverse(content);
return content;
}
接下来就可以根据ui调整想要的数据做界面了