Java反射机制和TelephoneManager电话监听

本文介绍如何在Android应用中使用TelephonyManager监听电话状态变化,并通过反射机制实现自动挂断电话的功能。具体包括PhoneStateListener的使用、不同电话状态的处理逻辑以及反射调用隐藏API的方法。
</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()实力化类对象


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值