Android 实现对图库更新的监听
通过自定义PhotoAlbumContentObserver 实现 ContentObserver 来监听系统图库的数据变化:
public class PhotoAlbumContentObserver extends ContentObserver {
// 自定义的接口
private OnChangeListener onChangeListener;
public PhotoAlbumContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Logger.e("图库有改变:Uri = " + uri);
if (uri.toString().contains("images")) {
// 要实现的接口回掉方法
if (onChangeListener != null) {
onChangeListener.onChange();
}
}
}
// 接口的set方法
public void setOnChangeListener(OnChangeListener onChangeListener) {
this.onChangeListener = onChangeListener;
}
// 定义接口
public interface OnChangeListener {
void onChange();
}
}
界面注册监听及实现PhotoAlbumContentObserver的监听方法
/**
* 对图库的数据库变化添加监听
*/
private void listenPhotoAlbumDB() {
if (photoAlbumContentObserver == null) {
PhotoAlbumHandler photoAlbumHandler = new PhotoAlbumHandler();
photoAlbumContentObserver = new PhotoAlbumContentObserver(photoAlbumHandler);
photoAlbumContentResolver = getContentResolver();
registerContentObserver();
}
}
/**
* 注册相册变化的相关监听
*/
private void registerContentObserver() {
if (photoAlbumContentObserver == null) {
return;
}
Uri photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
photoAlbumContentResolver.registerContentObserver(photoUri, false, photoAlbumContentObserver);
photoAlbumContentObserver.setOnChangeListener(() -> {
// 更新界面
// 通过Uri获取图片文件
FileBucket fileBucket = PhotoAlbumUtils.getFileBucketByUri(photoUri, activity, photoAlbumContentResolver);
if (fileBucket == null) {
Logger.e("通过uri 得到FileBucket 为null。");
return;
}
if (photoSelcedAdapter == null) {
return;
}
// 刷新界面
RecentFileItem fileItem = new RecentFileItem(null, RecentFileItem.CHILD);
fileItem.setFileBucket(fileBucket);
photoSelcedAdapter.addData(fileItem, 0);
photoSelcedAdapter.notifyDataSetChanged();
Logger.e(fileBucket.toString());
});
}
/**
* 取消注册监听相册的内容变化
*/
@Override
public void onDestroy() {
if (photoAlbumContentObserver != null) {
photoAlbumContentResolver.unregisterContentObserver(photoAlbumContentObserver);
photoAlbumContentObserver.setOnChangeListener(null);
photoAlbumContentObserver = null;
}
}
/**
* 图库更新的Handle 防止内存泄漏写成静态内部类
*/
private static class PhotoAlbumHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
在界面的oncreate 或者要实现监听的地方 调用 listenPhotoAlbumDB(); 即可。
工具类中的方法(就是一般的通过Uri得到文件的方法)
/**
* 通过Uri 得到图片文件的方法
*/
public static FileBucket getFileBucketByUri(Uri uri, Context context, ContentResolver contentResolver) {
if (!uri.toString().contains("image")) {
return null;
}
String[] projection = new String[]{
MediaStore.Images.Media._ID, // id
MediaStore.Images.Media.DISPLAY_NAME,// 文件名
MediaStore.Images.Media.DATA, // 文件路径
MediaStore.Images.Media.SIZE, // 文件大小 byte
MediaStore.Images.Media.BUCKET_DISPLAY_NAME, // 文件目录名称
MediaStore.Images.Media.DATE_MODIFIED // 最后一次修改时间
};
Cursor cursor = contentResolver.query(uri, projection,
null, null, null);
if (cursor == null) {
return null;
}
cursor.moveToLast(); // 倒序读取
FileBucket fileBucket = new FileBucket();
String imageId = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
if (imageId == null) {
return null;
}
String thumbnailPath = null;
String fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
String bucket = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
File file = new File(path);
// 如果文件不存在
if (!file.exists()) {
return null;
}
// 查询缩略图路径
String[] tumProjection = {MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID};
int id = Integer.valueOf(imageId);
String where = MediaStore.Images.Thumbnails.IMAGE_ID + "=" + id;
Cursor pathCursor = contentResolver.query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, tumProjection, where, null, null);
if (pathCursor != null && pathCursor.moveToFirst()) {
thumbnailPath = pathCursor.getString(pathCursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA));
pathCursor.close();
}
// 设置属性
fileBucket.setBucket(bucket);
fileBucket.setId(id);
fileBucket.setThumbnailsPath(thumbnailPath);
fileBucket.setFileShowName(fileName);
fileBucket.setFileCategory(FileBucket.PICTURE);
fileBucket.setFilePath(file.getPath());
fileBucket.setSize(file.length());
fileBucket.setLastModifiedTime(file.lastModified());
fileBucket.setFileState(FileBucket.DIR);
fileBucket.setFileSymbol(path);
fileBucket.setBucket(context.getString(R.string.photo_album_recent_file_name));
cursor.close();
return fileBucket;
}