Android 通过反射及AIDL获取双卡手机SIM卡相关信息,及注册监听

在Android 5.0之前,虽然也有手机是双卡手机,但是双卡方案都是ODM厂商自己做的,或者是有芯片厂商提供的源码完成。因此,如果要在4.4甚至更早之前的手机上获取双卡信息,基本上不是一向巨大的工程。虽然之前尝试过使用反射方法去获取 高通的“android.telephony.MSimTelephonyManager”类 MTK的"com.mediatek.common.telephony.ITelephonyEx.aidl"类, 打印出函数的方法和参数以及类属性,然后去猜测,但是由于无法直接阅读源码,而且ODM厂商也会自己去修改对应的代码实现其他用户痒点功能(主卡3/4G网络,副卡流量)等。 因此在Lollipop之前,双卡问题是暂时就放弃了。但是其他的功能调用还是有办法的。 例如在自己的项目下新建如下文件夹

把ITelephony.aidl放进来,然后通过反射TelephonyManager的getITelephony()方法获取 ITelephony实例,进而调用如endCall()等方法来实现如果来电黑名单拦截等方式 eg:

在Android 5.0以后,Google 官方API开始支持多SIM卡,这对开发者来说是一件好事,意味着应用能够实现的功能也越来越多。 在Lollipop上Google又新增了一个Isub.aidl的文件,从命名上就可以看出这是一个进程服务,所以在使用时和ITelephony.adil一样,在自己的项目里建立对应adil文件夹,把ISub.aidl拉进来就行了。使用时调用方式如下:

举个例子,假设现在是一台双卡双待的手机系统是Lollipop,我们想知道现在使用的是哪一张卡作为流量卡,那么久必须知道默认的流量的subId。具体方法是调用ISub.aidl的getDefaultDataSubId()。

对应的流量卡subId后则需要调用到TelephonyManager下的getSubscriberid(long subId)方法,但是这个方法有点坑的地方,就是在5.0的时候参数书long类型的,但是到了5.1的时候有换成了int类型,所以在使用时必须注意 具体使用

通过将系统的AIDL引入,还可以调用其他的方法来是显示更多的功能。 在6.0上Google进一步开放了SIM卡相关的API我们可以使用 SubscriptionManager这个API 这个使用管理类使用更简单,类似于TelephonyManager。 获取实例: 获取默认数据卡信息:

获取激活的SIM 卡数量:

,既然能获得SIM卡的信息,那还有个重要的东西想要获取,就是如何监听两张SIM的信号场强信息以及对应的基站邻区信息。 在5.0以前这是无法做到的,因为5.0以前,PhoneStateListener这个方法只有一个不带参数的构造函数,所以无法注册监听,但是到了5.0以后的版本就有了

但是一个大大的@hide就给你隔绝了监听的可能。 而且连参数protected也加了@hide明显是不对普通开发者开放的。

但是,我们都知道,反射是可以获取到类的参数,当然也可以设置参数值。 具体设置方法,在继承PhoneStateListener时实现构造函数

并且在构造函数中对监听进行设置。

扫描二维码关注公众号,回复: 92002 查看本文章

另外,还有一篇好文章: http://blog.csdn.net/firedancer0089/article/details/60121128

猜你喜欢

转载自my.oschina.net/u/2963604/blog/1616633