通过AIDL实现挂断电话功能

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();
发布了24 篇原创文章 · 获赞 5 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/g707175425/article/details/46471913