Android MCC 和 MNC

Android MCC and MNC

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

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

尽管此方法可以 return null 即使 SIMLOADED 并且可能 return 不同的结果,例如仅具有 GSM 连接的 lycamobile 卡给我 mnc = 01,当我取出 SIM 卡并重新插入时,它给我 mnc = 04.

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

此外,我不能使用 getResources().getConfiguration().mcc,因为它给出了一个整数,可能会在例如之前删除 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 功能),一切都按预期工作 mnc 与沃达丰卡相同 01

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

MCC、MNC、PLMN

首先要了解MCC和MNC:

MCC - Mobile Country Code
This is the country code. It always has 3 digits. Some countries can use more than one MCC.

MNC - Mobile Network Code
This is the network code. It can have 2 or 3 digits.

MCCMNC - PLMN Number.

这些数字用于区分一个运营商与另一个运营商。

例如,您可以在 www.mcc-mnc.com:

查看列表

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

MCC = 310
MNC = 410
PLMN = 310410

例如,巴西的 Telefonica 有以下 PLMN 号码:

MCC = 724
MNC = 10
PLMN = 72410

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

由于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 卡和网络

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

通过这种方式,您可以确定哪个运营商拥有该 SIM 卡。

另一方面,网络塔也广播了它的PLMN。

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

国内与漫游

家里的情况是simcard的PLMN Number和当前注册的网络相同

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

当然,有些运营商有多个 PLMN 号码,在这些情况下 phone 应该被视为 HOME。但这是另外一回事了。

最后是 getSimOperator() 和 getNetworkOperator()

getSimOperator()此方法returns来自SIM卡的MCCMNC(PLMN)

getNetworkOperator() 此方法 returns 来自当前驻留运营商的 MCCMNC (PLMN)

由你决定

现在,你知道simcard和网络运营商的区别了吧。因此,您必须决定如何 block/allow 您的应用。

  • 如果您通过 getSimOperator() 进行屏蔽,您将屏蔽来自特定国家/地区的 SIM 卡。这样,无论注册的小区如何,功能都将保持被阻止(即使用户正在前往启用该功能的国家/地区)。

  • 如果您按 getNetworkOperator() 阻止,您将阻止特定 networks/Contries 中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区旅行时可能会遇到问题。