1. 在项目的src中添加NeighboringCellInfo.aidl和ITelephony.aidl这两个aidl。
2.添加完之后,就可以在监听通话状态的服务类中,编写下面的代码了:
publicclass CallSerextendsService{
@Override
public IBinderonBind(Intent intent) {
returnnull;
}
/**
*
监听通话状态的类
*/
class MyListerextends PhoneStateListener {
@Override
publicvoidonCallStateChanged(int
state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://处于闲置状态
break;
// 处于闲置状态响铃状态
case TelephonyManager.CALL_STATE_RINGING:
//判断来电是否在黑名单中
//从黑名单数据库中查询,看来电号码是否在其中
BlacknumDao dao=new BlacknumDao(AddressService.this);
boolean isExit=dao.isExit(incomingNumber);
if(isExit){//如果来电在黑名单中,就对其拦截
endCall();//拦截来电
//注册内容观察者,把刚生成的通话记录给删除, 由于通话记录,不是立即在电话挂掉之后就生产记录,有延迟,所以需要注册内容观察者,观察通话记录是否有变化 getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI,true,new
MyObserver(new Handler(),incomingNumber));
return;
}
break;
}
}
}
/**
*
拦截电话
*/
publicvoid endCall(){
try {
//由于挂断电话的api是隐藏的,所以需要通过反射技术,调用其中的方法
Methodmethod = Class.forName("android.os.ServiceManager").getMethod("getService",
String.class);
IBinderbinder = (IBinder)method.invoke(null,new
Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.endCall();
} catch( Exception e) {
e.printStackTrace();
}
}
/**
*
删除通话记录
*/
publicvoid delCallLog(String num){
ContentResolver resolver=this.getContentResolver();
//通话记录的uri,可以通过CallLog.Calls.CONTENT_URI得到,"number"记录通话记录的号码
Cursorcursor= resolver.query(CallLog.Calls.CONTENT_URI,new
String []{"_id"},"number=?",
new String []{num},null);
if(cursor.moveToFirst()){
String id=cursor.getString(0);
resolver.delete(CallLog.Calls.CONTENT_URI,"_id=?",
new String[]{id});
}
}
/**
*
内容观察者
*/
class MyObserverextends ContentObserver{
private Stringnum;//黑名单号码
public MyObserver(Handler handler,String num) {
super(handler);
this.num=num;
}
@Override
publicvoid onChange(boolean
selfChange) {
super.onChange(selfChange);
delCallLog(num);
//刪除完通话记录之后,对内容观察者进行反注册
getContentResolver().unregisterContentObserver(this);
}
}
}