通过AIDL实现挂断电话功能

来源:互联网 发布:网络屏蔽器软件下载 编辑:程序博客网 时间:2024/05/01 21:03

1.通过查看TelephonyManager可以看到很多隐藏的方法,这些隐藏的方法大部分都是通过调用getITelephony得到一个ITelephony对象来实现这些功能的,可以看出TelephonyManager相当于一个包装类,主要功能都是在ITelephony对象中,想要实现挂断电话功能可以通过得到Itelephony实现,分析如下代码:
ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
可以看出Itelephony是通过aidl文件得到的,所以从安卓源码中找到
E:\2.3 source\JB\frameworks\base\telephony\java\com\android\internal\telephony\ITelephony.aidl
文件,并且查看它所在的包,在自己工程的src下创建同样的包,拷入ITelephony.aidl
2.拷入后通过查看ITelephony.aidl 文件源码,发现缺少一个aidl文件,查找NeighboringCellInfo.aidl 以同样方式复制进工程下.
3.调用 ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));发现ServiceManager是一个隐藏类,无法直接使用.那么只能通过反射得到类的getService方法.如:
//通过反射得到隐藏类
Class

    //通过AIDL得到的对象,调用挂断电话的方法    asInterface.endCall();

实现代码:

    //通过反射得到隐藏类    Class<?> serviceManager = MyTelephonyListener.class.getClassLoader().loadClass("android.os.ServiceManager");    Method method = serviceManager.getMethod("getService", String.class);    Object invoke = method.invoke(null,Context.TELEPHONY_SERVICE);    //使用AIDL得到接口对象    ITelephony asInterface = ITelephony.Stub.asInterface((IBinder) invoke);    //通过AIDL得到的对象,调用挂断电话的方法    asInterface.endCall();
0 0
原创粉丝点击