5

我正在尝试获取mccandmnc之后的SIM 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

4

1 回答 1

27

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

MCC、跨国公司、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 网络。

家庭与漫游

家庭情况是当 simcard 中的 PLMN 号码与当前注册的网络相同时。

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

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

最后 getSimOperator() 和 getNetworkOperator()

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

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

它是由你决定

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

  • 如果您阻止,getSimOperator()您将阻止来自特定国家/地区的 SIM 卡。这样,无论注册的小区如何,功能都将保持被阻止(即使用户正在前往启用该功能的国家/地区)。

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

于 2016-08-02T17:56:08.973 回答