【问题标题】:SubscriptionInfo.getMnc() drops leading zeros, cannot link MCC+MNC to SIM operatorSubscriptionInfo.getMnc() 删除前导零,无法将 MCC+MNC 链接到 SIM 运营商
【发布时间】:2018-03-23 08:57:55
【问题描述】:

我正在更新一些代码以使用在 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 返回整数,所以您会丢失某些 MNC 中的前导零。要查看一些示例,请查看表 here。当您连接 MCC+MNC 时,您将获得 SIM 运营商,因此保留经常出现的零很重要。例如,墨西哥的 NEXTEL 的 SIM 运营商值为“334090”,但由于 SubscriptionInfo 返回 MCC 和 MNC 的整数,因此您将分别获得值 334 和 90。

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    它也是一个隐藏的方法,但是你可以通过反射来访问它,得到你想要的字符串格式的信息,这至少来自Android 6Android 7

    public String getSimOperator(int subId)
    

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

    【讨论】:

      【解决方案2】:

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

      例如如果您的用户是 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2022-08-19
        相关资源
        最近更新 更多