安全卫士第四天--23黑名单拦截
case TelephonyManager.CALL_STATE_RINGING: // 零响状态
firstRingTime = System.currentTimeMillis();
Log.i(TAG,"来电号码为"+ incomingNumber);
// 判断incomingnumber是否在黑名单中
if(dao.find(incomingNumber)){
//挂断电话
endCall();
//deleteCallLog(incomingNumber);\
//不能立即删除通话记录,因为这个记录是挂断后一段时间才生成,可以用线程过几秒钟去执行删除,但体验效果不好,用下面的方式
//注册一个内容观察者 观察call_log的uri的信息
getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, new MyObserver(new Handler(),incomingNumber));
}
/**
* 根据电话号码删除呼叫记录
* @param incomingNumber 要删除呼叫记录的号码
*/
public void deleteCallLog(String incomingNumber) {
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{incomingNumber}, null);
if(cursor.moveToFirst()){//查询到了呼叫记录
String id =cursor.getString(cursor.getColumnIndex("_id"));
resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?",new String[]{id});
}
}
public void endCall() {
try {
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
private class MyObserver extends ContentObserver
{
private String incomingnumber;
public MyObserver(Handler handler,String incomingnumber) {
super(handler);
this.incomingnumber = incomingnumber;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
deleteCallLog(incomingnumber);
//当删除了呼叫记录后 反注册内容观察者
getContentResolver().unregisterContentObserver(this);
}
}