我试图在mcc
和mnc
状态之后获得SIM LOADED
,以检查SIM卡是否在没有READ PHONE STATE
权限的情况下进行更改,以便禁用用户不想要的某些网络和一些国家的应用程序请求。
由于getSimOperator()
可能根据当前载波而改变(例如,当用户正在漫游或不漫游时),所以我决定使用getNetworkOperator()
。
虽然这种方法可以返回null
,即使SIM
是LOADED
,并且可能返回不同的结果,例如,一个只有GSM连接的lycamobile卡给了我mnc = 01
,当我拿出SIM卡并再次放出来时,它给了我mnc = 04
。
有人知道为什么mnc会给出不同的getNetworkOperator()
**?结果吗?这种情况下哪种方法更好,** getNetworkOperator()
还是 getSimOperator()
?
另外,我不能使用getResources().getConfiguration().mcc
,因为它提供了一个整数,它可能在0
之前删除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
是相同的。
发布于 2016-08-02 17:56:08
让我和你分享一些信息。也许会有帮助。
MCC,MNC,PLMN
首先,您必须了解MCC和MNC:
MCC -移动国家代码 这是国家代码。它总是有三位数。有些国家可以使用多个MCC。 跨国公司-移动网络代码 这是网络代码。它可以有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与网络
simcard中存储的一个信息是PLMN号。从其IMSI中检索PLMN号码。它的PLMN数是IMSI的5或6个第一位数字。
这样,您就可以确定哪个运营商拥有该SIMCard。
另一方面,电视塔还播放了PLMN。
这样,每当您重新启动设备(或移动到另一个位置)时,设备都可以搜索其家庭网络。
HOME与漫游
国内情况是当PLMN号码从simcard是相同的当前注册网络。
漫游是当SIMCard具有与注册小区不同的PLMN时。
当然,一些运营商拥有一个以上的PLMN号码,在这种情况下,电话应该被视为家。但这是另一个故事。
最终getSimOperator()和getNetworkOperator()
getSimOperator()
这种方法从SIMCard返回MCCMNC (PLMN)
getNetworkOperator()
这种方法从当前的露营载波中返回MCCMNC (PLMN)。
,,这取决于你
现在,你知道simcard和网络运营商之间的区别了。因此,您必须决定如何阻止/允许您的应用程序。
getSimOperator()
阻塞,那么您就是在阻止来自特定国家的simcards。这样,不考虑已注册的单元格,功能仍然会被阻塞(即使用户是在使用该功能的国家旅行)。getNetworkOperator()
阻塞,则是在特定的网络/配置中阻塞该功能。这样,如果可以使用该应用程序的用户在前往某个功能被屏蔽的国家时可能会遇到问题。https://stackoverflow.com/questions/38726068
复制相似问题