你如何在Android中获得手机的MCC和MNC?

Posted

技术标签:

【中文标题】你如何在Android中获得手机的MCC和MNC?【英文标题】:how do you get the phone's MCC and MNC in Android? 【发布时间】:2009-05-20 21:31:01 【问题描述】:

我发现检索 MCC 和 MNC 的唯一方法是重写活动的 onConfigurationChanged 方法,如下所示:

public void onConfigurationChanged(Configuration config)

    super.onConfigurationChanged(config);
    DeviceData.MCC = "" + config.mcc;
    DeviceData.MNC = ""  +config.mnc;

但是,我在应用程序启动时需要这些数据,并且不能等待用户切换手机的方向或等效来触发此方法。有没有更好的方法来访问当前的 Configuration 对象?

【问题讨论】:

【参考方案1】:

TelephonyManager 有一种方法可以将 MCC+MNC 作为字符串 (getNetworkOperator()) 返回,这将满足您的需求。您可以通过以下方式访问它:

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    String networkOperator = tel.getNetworkOperator();

    if (!TextUtils.isEmpty(networkOperator)) 
        int mcc = Integer.parseInt(networkOperator.substring(0, 3));
        int mnc = Integer.parseInt(networkOperator.substring(3));
    

【讨论】:

如果没有插入 SIM 卡,getNetworkOperator() 将返回一个空字符串。所以if 条件应该包含!networkOperator.isEmpty()。我在我的 Nexus 5 上测试了它 另外,如果是 MVNO 会失败 getNetworkOperator() 返回 false。 SIM 卡已插入。为什么? 如何处理双卡设备? 'networkOperator.substring(0, 3)' 这在某些情况下会导致索引越界错误【参考方案2】:

您知道有两个 MCC/MNC 用于活动电话吗? (一个是SIM卡的国家代码和运营商ID,另一个是正在使用的网络/基站。)

如果getResources().getConfiguration().mcc 在飞行模式下不为空,则它是SimTelephonyManager.getSimOperator(),而不是towerTelephonyManager.getNetworkOperator()

我不知道 OP 想要哪个,但如果 getConfiguration 确实是 Sim 值,那么答案 3 会给他提供与原始代码不同的结果。

【讨论】:

getNetworkOperator()和getSimOperator()有什么区别;【参考方案3】:

getResources().getConfiguration().mcc 是一个糟糕的选择,因为它返回一个整数,因此会影响01044 等有效值。显然整数不是一个好的选择。

详情见Mobile_Network_Code

更新:在澳大利亚,我们在这里验证了一个错误案例。 getNetworkOperator 返回的值与 getSimOperator 不同,后者是正确的。

android 文档中查看详细信息:TelephonyManager

【讨论】:

【参考方案4】:

您可以通过getResources().getConfiguration() 访问当前配置。

【讨论】:

【参考方案5】:

好的,事实证明 getResources().getConfiguration().mcc 技巧可能更适合大多数用途,因为如果人们将手机置于飞行模式或以其他方式使用 Wi-Fi,那么它返回一个空的 MCC。

【讨论】:

【参考方案6】:

我发现即使插入了SIM卡,网络运营商有时在未连接到运营商(服务不可用)时也会像65@5一样。这发生在运行 Android 4.1.2 的三星 S2 上。

所以在转换为 Int 时要小心。

 int mcc = Integer.parseInt(networkOperator.substring(0, 3));

【讨论】:

【参考方案7】:

已更新。使用这个

 TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    String networkOperator = tel.getSimOperator();
    System.out.println("************mnc,mcc"+networkOperator);
    if (!TextUtils.isEmpty(networkOperator)) 
         mcc = networkOperator.substring(0, 3);
       mnc = networkOperator.substring(3);System.out.println("************mnc,mcc"+mnc+mcc);
    mnc_mcc.setText("************mnc,mcc"+mnc+","+mcc);

【讨论】:

以上是关于你如何在Android中获得手机的MCC和MNC?的主要内容,如果未能解决你的问题,请参考以下文章

如何在双SIM卡移动编程的情况下获得两个Sim的CID和LAC?

如何在不使用位置信息的情况下将 MCC + MNC 映射到 iOS Objective-C 中的用户电话国家代码?

MCC 和 MNC

SimInfo获取(MCC, MNC, PLMN)

手机IMSI码规则及算法介绍

IMSI与IMEI的区别