【问题标题】:Android MCC and MNCAndroid MCC 和 MNC
【发布时间】:2016-08-02 16:37:52
【问题描述】:

我试图在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 与沃达丰卡的01 相同。

【问题讨论】:

  • 我认为你有这个:Since getSimOperator() may change according to the current carrier (e.g. when the user is on roaming or not) I decided to use the getNetworkOperator(). 倒退。 getSimOperator 应该随 SIM 卡而改变——但在漫游等时不会改变。
  • 我虽然是相反的方式,但要在模拟器上测试,然后我会回复你,谢谢;)
  • 谢谢,就是你说的,getSimOperator()来自simcard

标签: android gsm mobile-country-code


【解决方案1】:

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

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 网络。

家庭与漫游

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

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

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

最后是getSimOperator()和getNetworkOperator()

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

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

由你决定

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

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

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

【讨论】:

  • 标记为正确,因为很好地澄清了我对此事的疑问,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多