采用注册通话记录的内容观察者来监听数据库的变化,从而达到监听未接来电。
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;
}
}
}