【问题标题】:how do you get the phone's MCC and MNC in Android?你如何在Android中获得手机的MCC和MNC?
【发布时间】: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 对象?

【问题讨论】:

    标签: java android mobile


    【解决方案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);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多