现在的位置: 首页 > 综合 > 正文

Android拦截电话并删除相应的通话记录

2013年08月20日 ⁄ 综合 ⁄ 共 2435字 ⁄ 字号 评论关闭

1.      在项目的src中添加NeighboringCellInfo.aidlITelephony.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);

       }

    }   

}

 

 

抱歉!评论已关闭.