您的位置:首页 > 大数据 > 人工智能

通过AIDL实现挂断电话功能

2015-06-12 15:10 337 查看
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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: