how do you get the phone's MCC and MNC in Android?

爱⌒轻易说出口 提交于 2019-12-17 15:22:49

问题


The only way I've found of retrieving MCC and MNC is by overriding an activity's onConfigurationChanged method, as such:

public void onConfigurationChanged(Configuration config)
{
    super.onConfigurationChanged(config);
    DeviceData.MCC = "" + config.mcc;
    DeviceData.MNC = ""  +config.mnc;
}

However, I need this data as soon as the app starts and can't wait for the user to switch the phone's orientation or equivalent to trigger this method. Is there a better way to access the current Configuration object?


回答1:


The TelephonyManager has a method to return the MCC+MNC as a String (getNetworkOperator()) which will do you what you want. You can get access it via:

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));
    }
}



回答2:


You do know there are two MCC/MNC's for an active phone? (One is the country code and carrier id for the Sim card, the other is for the network/cell tower in use.)

If the getResources().getConfiguration().mcc is not empty in airplane mode, it's the Sim value TelephonyManager.getSimOperator(), not the tower value TelephonyManager.getNetworkOperator().

I don't know which the OP wants, but Answer 3 will give him different results than his original code if the getConfiguration is really the Sim values.




回答3:


You can access the current configuration by getResources().getConfiguration() does the trick.




回答4:


getResources().getConfiguration().mcc is a bad choice because it returns an integer, hence compromising valid values such as 01, or 044. Clearly integer is not a good option for this.

See details in Mobile_Network_Code

Update: in Australia, we verified a wrong case here. The getNetworkOperator returns different value from getSimOperator, where the latter is correct.

See details in Android doc: TelephonyManager




回答5:


I found out that network operator sometimes can be like 65@5 when not connected to the operator (service unavailable) even if there is a a SIM card inserted. This happened on Samsung S2 running Android 4.1.2.

So you have to be careful when converting to Int.

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



回答6:


Okay, it turns out that the getResources().getConfiguration().mcc trick is likely better for most purposes, because with the other one if the person puts their phone in airplane mode or otherwise uses Wi-Fi, then it returns an empty MCC.




回答7:


this is updated. use this

 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);
}


来源:https://stackoverflow.com/questions/890366/how-do-you-get-the-phones-mcc-and-mnc-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!