Android MCC and MNC



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

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

尽管即使SIM LOADED此方法也可以返回null并且可能会返回不同的结果,例如,仅具有GSM连接的lycamobile卡给了我mnc = 01,当我取出SIM卡并再次放置时,它给了我mnc = 04

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

另外,我不能使用 getResources().getConfiguration().mcc,因为它给出了一个 int 数字,可能会在例如给出 4 而不是 04 之前删除0

这是我检查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 - 手机国家/地区代码
这是国家/地区代码。它总是有 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

根据上述信息,我们可以想象我们有 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卡和网络

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

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

在另一兰特,网络塔也广播其PLMN。

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

家庭与漫游

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

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

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

最后 getSimOperator(( 和 getNetworkOperator((

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

getNetworkOperator() 此方法从当前驻扎的承运人返回 MCCMNC (PLMN(

这取决于你

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

  • 如果您通过getSimOperator()阻止,则您正在阻止来自特定国家/地区的SIM卡。这样,无需注册单元格,该功能将保持被阻止状态(即使用户前往启用了该功能的国家/地区(。

  • 如果通过getNetworkOperator()阻止,则会阻止特定网络/Contries中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区时可能会遇到问题。

相关内容

  • 没有找到相关文章

最新更新