Android MCC 和 MNC
Android MCC and MNC
我正在尝试在 SIM LOADED
状态后获取 mcc
和 mnc
,以检查 SIM 卡是否在没有 READ PHONE STATE
权限的情况下更改,为了禁用用户不想要的某些网络和某些国家/地区的应用程序请求。
由于 getSimOperator()
可能会根据当前运营商而变化(例如,当用户是否在漫游时)我决定使用 getNetworkOperator()
。
尽管此方法可以 return null
即使 SIM
是 LOADED
并且可能 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 中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区旅行时可能会遇到问题。
我正在尝试在 SIM LOADED
状态后获取 mcc
和 mnc
,以检查 SIM 卡是否在没有 READ PHONE STATE
权限的情况下更改,为了禁用用户不想要的某些网络和某些国家/地区的应用程序请求。
由于 getSimOperator()
可能会根据当前运营商而变化(例如,当用户是否在漫游时)我决定使用 getNetworkOperator()
。
尽管此方法可以 return null
即使 SIM
是 LOADED
并且可能 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 中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区旅行时可能会遇到问题。