Android监听未接来电
16lz
2021-01-23
采用注册通话记录的内容观察者来监听数据库的变化,从而达到监听未接来电。
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; } }}
更多相关文章
- android 使用数据库事务提高操作效率
- android添加联系人(直接添加到联系人数据库)
- android增删改查sqlite数据库
- 【转载】Using SQLite from Shell in Android(在shell 下使用sqli
- android小功能实现之SQLite数据库的基本操作
- android观察者模式
- android sd卡数据库读取
- 【转】Android获取用于操作数据库的SQLiteDatabase实例【学习记
- Android Sqlite数据库查询操作使用 '%?%' 的问题