Android MCC和MNC

时间:2016-08-02 16:37:52

标签: android gsm mobile-country-code

我正在尝试在mcc状态之后获取mncSIM LOADED,以检查SIM卡是否确实在没有READ PHONE STATE权限的情况下进行了更改禁用某些网络的应用请求以及用户不想要的某些国家/地区。

由于getSimOperator()可能会根据当前运营商而变化(例如,当用户正在漫游时),我决定使用getNetworkOperator()

即使nullSIM,此方法仍可返回LOADED,但可能会返回不同的结果,例如一张只有GSM连接的lycamobile卡正在给我mnc = 01,当我拿出SIM卡并再次放入时,它会给我mnc = 04

有人知道为什么mnc会为getNetworkOperator()提供不同的结果吗?对于这种情况,哪种方法更好,getNetworkOperator()getSimOperator()

此外,我无法使用getResources().getConfiguration().mcc,因为它会提供一个可能会删除0之前的{0}}的数字。提供4代替04

这是检查SIM状态更改的代码:

@Override
public void onReceive(final Context context, Intent intent) {
    if (intent != null) {

        Bundle extras = intent.getExtras();

        if (extras != null) {
            String ss = extras.getString(EXTRAS_SIM_STATUS);
            if (ss != null && (ss.equals("LOADED"))) {
                TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && hasPermissions(READ_PHONE_STATE)) {
                   //here I get the imsi
                }else{
                   L.d("NetworkOperator result %s", telephonyManager.getNetworkOperator()); 
                   //saving in shared preferences in order to check if the sim is allowed or not
                   //this is also called on application onCreate() so I can check the current SIM
               }
            } 
        }
    }
}

PS:我使用的SIM卡只有GSM连接。此外,我尝试使用其他卡(具有4g功能),一切正常,沃达丰卡的mnc01相同。

1 个答案:

答案 0 :(得分:16)

让我与您分享一些信息......这可能有所帮助。

MCC,MNC,PLMN

首先,您必须了解MCC和MNC:

  

MCC - 移动国家代码
  这是国家/地区代码。它总是有3位数。某些国家/地区可以使用多个MCC。

     

MNC - 移动网络代码
  这是网络代码。它可以有2或3位数。

     

MCCMNC - PLMN号码。

这些数字用于区分一个载体和另一个载体。

例如,您可以在www.mcc-mnc.com处查看列表:

美国的AT& T有以下PLMN号码:

MCC = 310
MNC = 410
PLMN = 310410
例如,巴西的Telefonica有以下PLMN号码:

MCC = 724
MNC = 10
PLMN = 72410

根据上述信息,我们可以想象我们的PLMN有5位或6位数。

由于MNC可以有2位或3位数字,我认为您可以按如下方式检索MNC号码(知道MCC总是有3位数字):

String plmn = "33402"; // OR 334020
String mcc = plmn.substring(0,3);
String mnc = plmn.substring(3,plmn.length());
System.out.println("plmn[" + plmn + "] mcc[" + mcc + "] mnc[" + mnc + "]");

同一国家/地区的所有运营商共享相同的MCC号码。有些国家/地区拥有多个MCC ......但即便如此,该国家/地区的所有运营商都使用其中一个MCC。

因此,如果您想查看某些运营商的位置,您必须阅读其MCC(而不是其MNC)。

SIM和网络

存储在sim卡中的一个信息是PLMN号码。从其IMSI检索PLMN号码。其PLMN号码是其IMSI的5或6位数。

这样,您就可以确定哪个运营商拥有该SIM卡。

另一方面,网络塔还广播其PLMN。

这样,每次重启设备(或移动到其他位置)时,设备都可以搜索其HOME网络。

HOME vs ROAMING

家庭情况是指来自SIM卡的PLMN号码与当前注册的网络相同。

漫游是指SIM卡的PLMN与注册的小区不同。

当然,有些运营商有多个PLMN号码,在这种情况下,电话应被视为HOME。但这是另一个故事。

最后getSimOperator()和getNetworkOperator()

getSimOperator()此方法从SIMCard返回MCCMNC(PLMN)

getNetworkOperator()此方法从当前预占的Carrier

返回MCCMNC(PLMN)

由您决定

现在,您知道simcard和网络运营商之间的区别。因此,您必须决定如何阻止/允许您的应用。

  • 如果您屏蔽getSimOperator(),则表示您屏蔽了特定国家/地区的SIM卡。这样,无论注册的单元格如何,功能都将被阻止(即使用户正在前往启用该功能的国家/地区)。

  • 如果您按getNetworkOperator()阻止,则会阻止特定网络/条目中的功能。这样,如果可以使用该应用的用户在他访问该功能被阻止的国家/地区时可能会遇到问题。