SubscriptionInfo.getMnc()会丢弃前导零,无法将MCC + MNC链接到SIM运算符

时间:2017-01-24 01:28:14

标签: android

我正在更新一些代码,以使用在5.1中添加到Android的Multi SIM support。我们在应用程序中经常检查SIM运算符(或MCC + MNC组合),因此我编写的代码涉及从依赖TelephonyManager.getSimOperator()迁移到从SubscriptionManager获取SubscriptionInfos,每个代码都可以访问用于SIM卡的MCC和MNC。

//old way – can only access one SIM
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String simOperator = telephonyManager.getSimOperator();

//new way - gives access to all SIMs
SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList();
for(SubscriptionInfo info : subInfoList) {
    int mcc = info.getMcc();
    int mnc = info.getMnc();

    //do some stuff...
}

我发现因为它正在返回MCC和MNC的整数,你会失去某些跨国公司的领先零。要查看一些示例,请查看表格here。当您连接MCC + MNC时,您将获得SIM操作员,因此保留经常出现的零值非常重要。例如,墨西哥的NEXTEL的SIM运算符值为“334090”,但由于SubscriptionInfo返回MCC和MNC的整数,因此分别得到值334和90.

鉴于此问题,您如何可靠地将SubscriptionInfo的MCC + MNC对与已知SIM运营商列表中的特定SIM运营商相关联?这是对这个API设计的疏忽吗?有没有其他方法可以为多SIM卡手机中的每张SIM卡安装SIM卡?

2 个答案:

答案 0 :(得分:0)

MCC总是3位数,其余为MNC,正如您所说,可能有2位或3位数。

如果将int解析为String,则可以只获取它的子字符串并根据需要处理信息。

它也是一种隐藏方法,但您可以通过反射访问它,以String格式获取所需信息,这至少存在于Android 6Android 7

public String getSimOperator(int subId)

但我认为SubscriptionManager方式更安全,因为它是开放的API,目前你不需要为处理它的Android版本而烦恼。

答案 1 :(得分:0)

实现此目的的最佳方法是从SIM卡读取IMSI。如果您正在直接阅读MNC + MNC且您的用户正在漫游或连接到另一个网络,则返回的值将不可靠。

E.g。如果您的用户是NEXTEL客户,但正在旅行或由于网络连接问题连接到另一个网络,比如Telcel,则MCC + MNC返回的值将来自Telcel。

为了将当前SIM的运营商与预定义列表可靠地匹配,请使用来自Telephony Manager的getSubscriptionId()从SIM卡读取IMSI值。

运营商的

IMSI starts with MCC+MNC。您可以轻松检查MCC + MNC是否匹配如下

final String mccMncToCompare = "334090"; //You can also use Integer instead of string. You just have to perform type conversion
final TelephonyManager tm = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
final String imsi= tm.getSubscriberId();
final boolean mccMncMatched = imsi.startsWith(mccMncToCompare);