Android ContentObserver实现截图后自动刷新相册(图库)的功能

笔者前段时间做了一个相册应用,基本功能包括查询媒体库,按日期倒序分类展示图片,缩放、放大、滑动图片,外部调用相册等功能,感兴趣的同学可以私信我.今天只介绍相册页面系统截图自动刷新的功能.

一提到观察数据变化,刷新UI,就应该想到观察者模式.而我们是相册应用,只需要监听对应的系统媒体库变化就可以了,系统提供了ContentObserver类来帮助我们实现功能,下面请看代码,注释已经很清楚了:

//初始化监听方法
private void listenMediaDB() {   
       if (mScreenObserver == null) {
            ScreensHandler screensHandler = new ScreensHandler();
            mScreenObserver = new ScreenshotContentObserver(screensHandler);
            registerContentObserver();
        }
    }	
//注册监听图片媒体库URL的数据变化
private void registerContentObserver() {  
        if (mScreenObserver != null) {
            Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            getContentResolver().registerContentObserver(imageUri, false, mScreenObserver);
            mScreenObserver.setOnChangeListener(new ScreenshotContentObserver.onChangeListener() {
                @Override
                public void onChange() {
                  //这里刷新数据,更新UI
                }
            });
            Log.i(TAG, "registerContentObserver!----------");
        }
    }
//静态内部类,防止内存泄漏
static class ScreensHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    }
@Override
public void onDestroy() {
 	if (mScreenObserver != null) {
	//反注册监听
        getContentResolver().unregisterContentObserver(mScreenObserver);
        mScreenObserver.setOnChangeListener(null);
        mScreenObserver = null;
      }
}

public class ScreenshotContentObserver extends ContentObserver {
    public static final String  TAG         = "ScreenshotContentObserver";
    private             int     mCount      = 0;
    public static final int     DATA_CHANGE = 0x110;
	private onChangeListener mOnChangeListener;
	   
    public ScreenshotContentObserver(Handler handler) {
        super(handler);
    }
 
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
    }
   /**
     * onChange中响应数据库
     */
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        Log.d(TAG, "onChange() returned: uri = " + uri);
		//截图的URL为 content://media/external/images/media
        if (uri.toString().contains("images")) {  
		//截图后偶尔会onChange2次,可以这么处理
           mCount += 1;
//         if (mCount == 1) {
            if (mOnChangeListener != null) {
                mOnChangeListener.onChange();
//                }
            }
        }
    }
	//截图刷新数据后,可以set为0;
    public void setOnChangeCount(int count) {
        this.mCount = count;
    }
    public void setOnChangeListener(onChangeListener mOnChangeListener) {
        this.mOnChangeListener = mOnChangeListener;
    }
    public interface onChangeListener {
        void onChange();
    }
}



猜你喜欢

转载自blog.csdn.net/erweidetaiyangxi/article/details/79093227