gpt4 book ai didi

安卓 MCC 和 MNC

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:28 56 4
gpt4 key购买 nike

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

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

尽管此方法可以返回 null,即使 SIMLOADED 并且可能返回不同的结果,例如仅具有 GSM 连接的 lycamobile 卡给我 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
}
}
}
}
}

PS:我使用的 SIM 卡只有 GSM 连接。我还尝试使用另一张卡(具有 4g 功能),一切都按预期工作 mnc 与 vodafone 卡的 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 网络。

在家与漫游

home情况是simcard的PLMN Number和当前注册的网络相同。

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

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

最后是 getSimOperator() 和 getNetworkOperator()

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

getNetworkOperator() 此方法返回当前驻留运营商的 MCCMNC (PLMN)

由你决定

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

  • 如果您通过 getSimOperator() 进行阻止,您将阻止来自特定国家/地区的 sim 卡。这样,无论注册的手机是什么,该功能都将保持被阻止状态(即使用户正在前往启用该功能的国家/地区旅行)。

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

关于安卓 MCC 和 MNC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38726068/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com