我试图在 mcc 状态之后获取 mncSIM LOADED,以检查 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 与沃达丰卡的 01 相同。

最佳答案

让我与您分享一些信息。它可能会有所帮助。

MCC、跨国公司、PLMN

首先,您必须了解MCC和MNC:



这些数字用于区分一个运营商和另一个运营商。

例如,您可以查看 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 号码。从其 IMSI 中检索 PLMN 号码。它的PLMN编号是其IMSI的前5或6位数字。

通过这种方式,您可以确定哪个运营商拥有该 SIMCard。

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

这样,每次您重新启动设备(或移动到另一个位置)时,设备都可以搜索其 HOME 网络。

家庭 vs 漫游

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

漫游是指 SIMCard 具有与注册小区不同的 PLMN。

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

最后 getSimOperator() 和 getNetworkOperator()
getSimOperator() 此方法从 SIMCard 返回 MCCMNC (PLMN)
getNetworkOperator() 此方法从当前驻留的运营商返回 MCCMNC (PLMN)

由你决定

现在,您知道simcard 和网络运营商之间的区别了。因此,您必须决定如何阻止/允许您的应用程序。
  • 如果您通过 getSimOperator() 阻止,您将阻止来自特定国家/地区的 SIM 卡。这样,不管注册的小区,功能将保持被阻止(即使用户正在前往启用该功能的国家/地区)。
  • 如果您通过 getNetworkOperator() 阻止,您将阻止特定网络/国家/地区中的功能。这样,如果可以使用该应用程序的用户在前往该功能被阻止的国家/地区旅行时可能会遇到问题。
  • 关于Android MCC 和 MNC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38726068/

    10-10 05:46