Android 实现对图库更新的监听

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;
    }

猜你喜欢

转载自blog.csdn.net/pyaizhu/article/details/79787672