魅族sim卡槽16只有一张sim卡,插卡槽1还是卡槽2,有区别吗

深圳市维宁芯科技有限公司

月成茭 106笔 评价

月成交 111笔 评价

惠州市瑞雪科技有限公司

盛亨汇电子科技有限公司

深圳市维宁芯科技有限公司

近期公司下发了新任务需要对Android掱机进行双sim卡的管控,而这个功能的关键在于的准确的获取sim卡的SubscriberId值做过sim卡相关或者电话功能的工程师会很清楚,Android SDK提供了一个方法来获取sim鉲的getSubscriberId值可是这只能获取其中主卡的id值,而副卡根本没有提供API而且国内的手机大多是双卡手机,所以笔者花了很大功夫调研了大部分市場的畅销Android手机的双卡功能

整个功能比较繁琐,所以一共分上下两部分讲述上部讲述市场上主流手机获取副卡Id的方法,以及遇到的困难注意事项;下部讲述如何整合所有的方案,实现机型自适配提供一个稳定的API,供其他程序使用

原生的Android是不支持双卡双待功能的,所鉯Android sdk没有提供API直到在Android6.0+上增加了相关的API,但是国内的android嘛有6.0和没6.0没啥区别,碎片化导致只能利用另外一种方法去获取了—反射关于反射相關的知识,这里就不进行讲解了因为获取副卡id会用到大量的反射,不懂的读者可以学习这篇博文[]

先说说最困难的地方吧,国内的双卡功能是由厂商联合芯片开发商定做的所以芯片商不一样,厂商不一样实现方案也就不一样,所以反射的类和函数名也不一样总的来說,目前全球有高通(小米)联发科(魅族sim卡槽),麒麟海思(华为)猎户座(三星)四家移动通讯芯片制造商,笔者通过一周的时間将公司的所有测试机进行了反射获取,终于总结出了如下方案:

  • 高通系手机获取副卡的API还算规范化直接在android的原生类中添加了方法,洏android6.0+提供的官方双卡API也是这样做的android提供获取simid原生单卡API为:

所以使用部分厂商直接在TelephonyManager类中重载了该方法, 不过厂商的重载的参数不同比如筆者在进开发时发现,小米红米系列使用的重载方法为getSubscriberId(int id),而vivo,oppo,中兴则使用getSubscriberId(long id)反射的代码如下:

2.使用HashSet保存结果,这里使用set保存结果的原因有2點
第一是因为厂商问题系统不会给你准确的返回卡槽1或者卡槽2的值,而是一旦判定卡槽里有卡就会返回比如,一张卡插在任意一个卡槽中通过系统API都能返回SIMid。所以在插入双卡的情况下,通过反射可能会获取到所有的值我们没有办法根据卡槽来获取值,保证卡与卡槽的一一对应这样只能采用set的唯一性来保证获取到所有的值。

第二还是因为厂商原因笔者在开发时发现,通过反射getSubscriberId(long id)方法这里的参数id沒有任何可参考性,当初以为可以输入0,1就能返回不同的simid结果是输入5才能获取另一个simid……而且,就拿vivo的一款旗舰机而言输入从1-9,只有输叺5才获取到副卡的id其他返回的都是主卡的id,这就很坑了所有笔者简单粗暴的使用for循环,不管有没有值都存到set里,性能会影响但保證功能。总结一句话厂商提供的getSubscriberId(long id)方法的id没有参考意义,直接简单粗暴的循环这也导致了笔者实现的此功能的缺陷:只能获取到simid,没有办法保证卡与卡槽的一一对应

华为系手机比较复杂,因为和自身的芯片有关系比如,大部分华为高端机型使用了自身的芯片第二张sim卡的楿关API封装在android.telephony.MSimTelephonyManager这个类,而部分采用高通机型的华为手机还是使用高通方案比如华为P7,P8P9用了自身方案,而MATE8采用了高通方案笔者在后期适配时被整的很惨……

 
代码与上文中高通系手机反射方案差不多,不同的是增加了一个反射类的处理

 
这样我们就能获取到类的实例然后反射去执行就行了,其他操作如上文

 
早期的三星系使用的是自家的方案,如note23,s4等三星也和华为一样,另外封装了一个类来管理副卡洏近期的高端机型貌似使用了android原生双卡管理,就是高通方案
代码如下:
个人觉得另外封装一个类是比较好的处理……
 
反射方案和高通类姒,就是反射的方法不同这里就不贴代码了……
 
其他手机反射方案也不写了,因为笔者找遍公司所有测试机没有找到这些山寨机
不过偠适配这些机型的,可以这个博文



结束语:
这是笔者第一次写博文所以写的不好请多包含,有什么问题或者错误请指正互相进步嘛。
歡迎转载请指明出处。
关于双卡功能的管理本文只是对市场上android手机双卡的一次普查,以及方案的提供目前是市场上存在的机型大多使用这些方法,而且网上也有很多相关博客所以如何适配机型,根据机型来选择正确的方案这才是实现的难点。采用人为枚举是一个佷傻叉的行为(因为笔者早期的方案就是枚举所有机型)适配的工作,应该交给软件自身来做所以,下一篇博文会讲述如何整和这些方案让程序自行进行适配,选择合适的方案获取simid相关代码会在下一博文中提供开源地址。

我要回帖

更多关于 魅族sim卡槽 的文章

 

随机推荐