我正在尝试在SIM LOADED
状态后获取mcc
和mnc
,以检查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中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区时可能会遇到问题。