Android双卡手机:获取主卡副卡的simid(上)方案实现

本文介绍了在Android双卡手机中获取副卡SubscriberId的挑战和解决方案,涉及高通、华为、三星和联发科等不同芯片厂商的反射方法。文章详细讲解了反射获取过程中的异常处理和注意事项,并指出由于厂商差异,无法保证卡与卡槽的一一对应。下篇将讨论如何实现机型自适配的稳定API。
摘要由CSDN通过智能技术生成

近期公司下发了新任务,需要对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会用到大量的反射,不懂的读者可以学习这篇博文[http://www.cnblogs.com/lzq198754/p/5780331.html。]

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

  • 高通系:
    代表手机:小米,vivo,oppo
    反射的类:TelephonyManager
    反射方法:getSubscriberId(int id)
    反射方法:getSubscriberId(long id)

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

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String id = telephonyManager.getSubscriberId();

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

public int getSecondImsi(Context context) throws InvocationTargetException,IllegalAccessException, NoSuchMethodException {
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Class<?> telephony
在Java面向对象中,如果要实现可以使用主卡余额,可以通过以下步骤来实现: 1. 创建一个名为"Card"的类,该类具有一个私有属性"balance"表示的余额。 2. 在"Card"类中提供一个公共方法"getBalance()"用于获取的余额。 3. 在"Card"类中提供一个公共方法"setBalance()"用于设置的余额。 4. 创建一个名为"MainCard"的子类,继承自"Card"类。在"MainCard"类中重写"setBalance()"方法,确保设置的余额不小于0。 5. 创建一个名为"SubCard"的子类,同样继承自"Card"类。在"SubCard"类中重写"getBalance()"方法,使其返回主卡的余额。 6. 在主程序中创建一个主卡对象和一个对象。 7. 使用主卡对象的"setBalance()"方法设置主卡余额。 8. 使用对象的"getBalance()"方法获取主卡余额。 以下是示例代码: ```java class Card { private double balance; public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } } class MainCard extends Card { @Override public void setBalance(double balance) { if (balance >= 0) { super.setBalance(balance); } else { System.out.println("Invalid balance."); } } } class SubCard extends Card { @Override public double getBalance() { return super.getBalance(); } } public class Main { public static void main(String[] args) { MainCard mainCard = new MainCard(); SubCard subCard = new SubCard(); mainCard.setBalance(100.0); subCard.setBalance(mainCard.getBalance()); System.out.println("Sub card balance: " + subCard.getBalance()); } } ``` 在上述代码中,主卡对象通过"setBalance()"方法设置余额,对象通过"getBalance()"方法获取主卡余额。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值