android黑名单挂断电话(endCall)反射方法获取

由于保证手机安全性,挂断电话的endcall方法被隐藏了。但是我们可以通过java反射机制获得此方法去拦截电话,下面代码为拦截电话片段代码。请参阅

//获取到系统的电话服务
       TelephonyManager  tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
 MyPhoneStateListener listener = new MyPhoneStateListener();
        //设置监听
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
 private class MyPhoneStateListener extends PhoneStateListener {
        //电话状态改变的监听
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
//            * @see TelephonyManager#CALL_STATE_IDLE  电话闲置
//            * @see TelephonyManager#CALL_STATE_RINGING 电话铃响的状态
//            * @see TelephonyManager#CALL_STATE_OFFHOOK 电话接通
            switch (state){
                //电话铃响的状态
                case TelephonyManager.CALL_STATE_RINGING:

                    String mode = dao.findNumber(incomingNumber);
                    /**
                     * 黑名单拦截模式
                     * 1 全部拦截 电话拦截 + 短信拦截
                     * 2 电话拦截
                     * 3 短信拦截
                     */
                   if(mode.equals("1")|| mode.equals("2")){
                       System.out.println("挂断黑名单电话号码");

                       Uri uri = Uri.parse("content://call_log/calls");

                       getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler(),incomingNumber));

                       //挂断电话
                       endCall();

                   }
                    break;
            }
        }
    }
/**
     * 挂断电话(通过反射机制获得隐藏的endCall方法)
     */
    private void endCall() {

        try {
            //通过类加载器加载ServiceManager
            Class clazz = getClassLoader().loadClass("android.os.ServiceManager");
            //通过反射得到当前的方法
            Method method = clazz.getDeclaredMethod("getService", String.class);

            IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);

            ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);

            iTelephony.endCall();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

  1.  * 挂断电话(通过反射机制获得隐藏的endCall方法) 
  2.      */  
  3.     private void endCall() {  
  4.   
  5.         try {  
  6.             //通过类加载器加载ServiceManager  
  7.             Class clazz = getClassLoader().loadClass("android.os.ServiceManager");  
  8.             //通过反射得到当前的方法  
  9.             Method method = clazz.getDeclaredMethod("getService", String.class);  
  10.   
  11.             IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);  
  12.   
  13.             ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);  
  14.   
  15.             iTelephony.endCall();  
  16.   
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.   
  21.     }  

你可能感兴趣的:(java)