采用注册通话记录的内容观察者来监听数据库的变化,从而达到监听未接来电。

private MissedCallContentObserver mMissedCallContentObserver;


mMissedCallContentObserver = new MissedCallContentObserver(this.getApplicationContext(), null);


//监听通话记录的数据库Uri

getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, false, mMissedCallContentObserver);


public class MissedCallContentObserver extends ContentObserver {    private Context mContext;    private static final String TAG = "MissedCallContentObserver";    private static final String[] PROJECT = new String[]{            CallLog.Calls.CACHED_NAME,            CallLog.Calls.NUMBER,            CallLog.Calls.TYPE,            CallLog.Calls.NEW,            CallLog.Calls.DATE    };    private static final int MISSED_CALL_MSG = 1;    private long mMissedCallDate;    public MissedCallContentObserver(Context context, Handler handler) {        super(handler);        mContext = context;    }    @Override    public void onChange(boolean selfChange) {        Cursor cursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI,                PROJECT, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);        if (cursor != null) {            if (cursor.moveToFirst()) {                int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));                switch (type) {                    case CallLog.Calls.MISSED_TYPE:                        Log.v(TAG, "missed type");                        if (cursor.getInt(cursor.getColumnIndex(CallLog.Calls.NEW)) == 1) {                            String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));                            String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));                            long date = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));                            if (!checkSameItem(date)) {                                Log.d(TAG, " not the same missed!");                                mMissedCallDate = date;                                Message msg = Message.obtain();                                msg.what = MISSED_CALL_MSG;                                msg.obj = new DataHolder(name, number, ListenServiceUtils.dateFormat(date));//                                mHandler.removeMessages(MISSED_CALL_MSG);                                mHandler.sendMessageDelayed(msg, 1000);                            } else {                                Log.d(TAG, " The same missed call, ignore it!");                            }                        }                        break;                    case CallLog.Calls.INCOMING_TYPE:                        Log.v(TAG, "incoming type");                        break;                    case CallLog.Calls.OUTGOING_TYPE:                        Log.v(TAG, "outgoing type");                        break;                }            }            cursor.close();        }    }    private boolean checkSameItem(long date) {        return mMissedCallDate == date;    }    private Handler mHandler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case MISSED_CALL_MSG:                    DataHolder dh = (DataHolder) msg.obj;                    Log.v(TAG, "you have a missed call, name : " + dh.name + ", number: " + dh.number                            + ", date: " + dh.date);                    callForwad(dh);                    break;                default:                    break;            }        }    };    private class DataHolder {        public String name;        public String number;        public String date;        public DataHolder(String name, String nubmer, String date) {            this.name = name;            this.number = nubmer;            this.date = date;        }    }}



更多相关文章

  1. android 使用数据库事务提高操作效率
  2. android添加联系人(直接添加到联系人数据库)
  3. android增删改查sqlite数据库
  4. 【转载】Using SQLite from Shell in Android(在shell 下使用sqli
  5. android小功能实现之SQLite数据库的基本操作
  6. android观察者模式
  7. android sd卡数据库读取
  8. 【转】Android获取用于操作数据库的SQLiteDatabase实例【学习记
  9. Android Sqlite数据库查询操作使用 '%?%' 的问题

随机推荐

  1. android快捷设置标题样式布局
  2. 【Android】UI界面外的线程,控制刷新UI界
  3. AndroidManifest.xml - 【 manifest ->
  4. Android JNI知识简介
  5. Android的appcompatv7导入错误处理
  6. android虚拟键盘挡住了输入框处理办法!
  7. Android发展 四大组件简介 SDK目录结构
  8. android ClipboardManager(剪贴板管理器)
  9. Android(安卓)SDK manager镜像服务器
  10. Handler、MessageQueue、Looper 之间的关