Android MCC和MNC

iGo*_*oDa 3 android gsm mobile-country-code

我试图让mccmnc一个后SIM LOADED状态,以检查SIM卡的确发生了变化没有READ PHONE STATE权限,以禁用某些网络应用程序的请求,并在一些国家,用户不想要的.

由于getSimOperator()可能会根据当前的运营商进行更改(例如,当用户正在漫游时),我决定使用getNetworkOperator().

虽然这种方法可以返回null即使SIMIS LOADED,可能会返回不同的结果,如莱卡移动通讯卡仅限GSM连接是给我mnc = 01,当我把SIM卡取出并再次把它放在它给了我mnc = 04.

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

此外,我不能使用,getResources().getConfiguration().mcc因为它给出一个int数字可能会删除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
               }
            } 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:我使用的SIM卡只有GSM连接.我也试过用其他卡(支援4G功能),一切都会按预期mnc相同01的沃达丰卡.

W0r*_*0le 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
Run Code Online (Sandbox Code Playgroud)

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

MCC = 724
MNC = 10
PLMN = 72410
Run Code Online (Sandbox Code Playgroud)

根据上述信息,我们可以想象我们有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 + "]");
Run Code Online (Sandbox Code Playgroud)

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

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

SIM和网络

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

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

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

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

家庭与漫游

家庭情况是当来自simcard的PLMN号码与当前注册的网络相同时.

漫游是指SIM卡具有与注册的小区不同的PLMN.

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

最后是getSimOperator()和getNetworkOperator()

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

getNetworkOperator() 该方法从当前预占的载波返回MCCMNC(PLMN)

它是由你决定

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

  • 如果您阻止,getSimOperator()则阻止来自特定国家/地区的sim卡.这样,无论注册的单元格如何,功能都将保持阻止状态(即使用户正在前往启用该功能的国家/地区).

  • 如果您阻止,getNetworkOperator()则阻止特定网络/条目中的功能.这样,如果可以使用该应用程序的用户在他漫游到该功能被阻止的国家时可能会出现问题.