Java反射机制和TelephoneManager电话监听

</pre><pre class="java" name="code"> TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            PhoneStateListener listener=new PhoneStateListener(){
                @Override
                //监测电话状态的变化。
                public void onCallStateChanged(int state, String incomingNumber) {  // state 电话的状态 incomingNumber 打进来的号码
                   switch(state){
                       //无状态
                       case  TelephonyManager.CALL_STATE_IDLE:

                           break;
                       //通话状态
                       case  TelephonyManager.CALL_STATE_OFFHOOK:
                           break;
                       //响铃状态
                       case  TelephonyManager.CALL_STATE_RINGING:
                          int mode= Blackmdb.getInstance(getApplicationContext()).queuenumber(incomingNumber);
                           if(mode==2||mode==3){
                               Log.d("挂断电话","挂断");
                               endcall();
                           }
                           break;
                       default:
                           break;
                     }
                    super.onCallStateChanged(state,incomingNumber);

                }

            };
            tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);

private void endcall() {
    //利用反射机制挂断电话
        try {
            //获取类对象
            Class clazz= Class.forName("android.os.ServiceManager");
            //获取类中方法,这个方法是非静态的
            Method mothod = clazz.getDeclaredMethod("getService",String.class);
            //执行这个方法
           IBinder binder= (IBinder) mothod.invoke(null, Context.TELEPHONY_SERVICE);
            ITelephony iTelephony = ITelephony.Stub.asInterface(binder);
            iTelephony.endCall();//挂断电话
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


反射机制:

调用隐藏类中的方法直接调用不了时 采用反射调用的方法。
1.获取class 对象。
a.类型.class  类名.class
b.Class.forname("完整路径+类名");
c.obj.getClass(); 通过实例化对象获取类对象

2.获取method对象。
Class.getMethod("名",参数类型(String.class)) ....

3.产生实例对象(非静态方法)
class.newInstance()无参。

4.调用
方法对象invoke
method.Invoke(obj(调用该方法的对象),参数)
 

由于返回的是一个Ibandler 对象,aidl 方式调用服务的方法。
如果报错说明引用了其他的AIDL文件,重新考。(包名类名一致)
返回的bindler 通过aidl 返回一个Itelephony对象。
就可以挂断。静态方法。
1类对象的常用方法
getname()获得类中完整名称
getDeclaredFields()获取类中所有属性
getDeclaredMethods 获得类中所有方法
getConstructors获得类构造方法
newInstance()实力化类对象


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值