一个蛋疼的功能,监听android系统媒体库的变动

思考了很久,最后决定写博客,这是我入android坑两年多以来的第一篇博客,如果写的不好,往见谅。

废话不多说,直接上菜!!!

最近遇到一个非常奇葩的功能,做一个类似相册类的应用,名曰:智能相册,涉及到本地媒体库比较多。一开始需求写了这个功能我很懵,因为本地的系统定制太多,一看就知道适配很难做,接下来就是各种挖坑、填坑的过程。

博主开发这个功能主要是用到一个ContentObserver,就是观察者,因为android系统很多的数据库应该都做了观察者的封装,所以直接自定这个类监听,给相应的uri就能监听对应的数据库变化情况,于是就有了以下代码:

public class ScreenshotContentObserver extends ContentObserver {
    private Context mContext;
    private int num = 0;
    private boolean se = false;

//回调的uri,博主实际上只用到了三个,一个相机照片,相机video,还有就是对应删除的(删除有点坑,删一个就回调两个)
    private static final String delete = "content://media/external";
    private static final String photo = "content://media/external/images/media";
    private static final String video = "content://media/external/video/media";


    public ScreenshotContentObserver(Context context, Handler handler) {
        super(handler);
        mContext = context;
    }


    /**
     * 主要在onChange中响应数据库变化,并进行相应处理

*  uri:回调的uri就是对应数据库增加的uri

*  接下来就是用uri去查对应的数据库,代码贴在下面
     */
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange);
        num++;
        /*---------------进行相应处理----------------*/


        switch (uri.toString()){
            case delete:
               
                Log.e("删除回调", "onChange: "+selfChange);
                Photos photos = new Photos();
                photos.setFileState(num);
                RxBus.getDefault().post(photos);
                break;
            case photo:
               
               
                Log.e("photo", "onChange: "+photos1.toString());
                break;
            case video:
                
                if (photos2 != null)
               
                break;
        }


    }

//用contentResolver查询数据库,里面的一些字段是我们项目中的


public static Photos getPhotos(Context context, Uri uri,int type){


        Photos photos= null;
        Cursor cursor = null;
        if (type == 1){
            cursor = context.getContentResolver().query(
                    uri
                    , null
                    , "date_added" + ">?"
                    , new String[]{ShpUtil.getInstance().getLong(Const.SYNC_LOCAL_VIDEO_TIME) + ""}
                    , "date_added" + " DESC LIMIT 0,1");
        }else {
            cursor = context.getContentResolver().query(
                    uri
                    , null
                    , "(" + "mime_type" + "=? OR " + "mime_type" + "=? ) AND " + "bucket_display_name" + "=?" + " AND " + "date_added" + ">?"
                    , new String[]{"image/jpeg", "image/png", "Camera", ShpUtil.getInstance().getLong(Const.SYNC_LOCAL_IMAGE_TIME) + ""}
                    , "date_added" + " DESC LIMIT 0,1");
        }


        if (cursor != null){
            photos = new Photos();
            if (cursor.moveToFirst()) {
              
                String path = cursor.getString(cursor.getColumnIndex("_data"));
                String title = cursor.getString(cursor.getColumnIndex("title"));
                long milli_date = cursor.getLong(cursor.getColumnIndex("datetaken"));
                if (milli_date == 0) {
                    milli_date = cursor.getLong(cursor.getColumnIndex("date_added")) * 1000;
                }
                Log.e("时间", "getPhotos: "+milli_date );
                long videoTime = 0;
                if (type == 1) {
                    videoTime = cursor.getLong(cursor.getColumnIndex("duration"));
                }


                String displayName = cursor.getString(cursor.getColumnIndex("_display_name"));
                long size = cursor.getLong(cursor.getColumnIndex("_size"));


                double lat = cursor.getDouble(cursor.getColumnIndex("latitude"));
                double lng = cursor.getDouble(cursor.getColumnIndex("longitude"));
                System.out.println("系统广播" + path);
                photos.setFileName(title);
                photos.setLocalUrl(path);
                photos.setFileSize(size);
                photos.setFileSuffix(StringUtil.subStringToLocal(displayName));
                if (type == 1){
                    photos.setFileType(3);//int 1是图片 ,3是视频
                }else {
                    photos.setFileType(1);//int 1是图片 ,3是视频
                }


                photos.setIsClouds(false);//是否云端
                photos.setLatitude(lat);
                photos.setLongitude(lng);
                photos.setFileState(0);
                if (type == 1)
                    photos.setDuration(videoTime);
                photos.setShowMonth(DateUtil.dateToMonth(milli_date));
                photos.setShowDay(DateUtil.dateToDay(milli_date));
                photos.setShowDate(StringUtil.getWeek(milli_date));
                photos.setTakenDate(new Date(milli_date));
            }
            cursor.close();
        }
        return photos;
    }

你可能感兴趣的:(日常坑)