当前位置: 首页 > 知识库问答 >
问题:

订阅我nfo.getMnc()下降前导零,不能链接MCC MNC到SIM操作员

谷梁宝
2023-03-14

我正在更新一些代码,以使用5.1中添加到Android中的多SIM卡支持。我们在应用程序中经常检查SIM卡运营商(或MCC-MNC组合),因此我正在编写的代码涉及到从依赖TelephonyManager的迁移。getSimOperator()从SubscriptionManager获取SubscriptionInfo,每个SubscriptionManager都允许访问SIM卡的MCC和MNC。

//old way – can only access one SIM
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String simOperator = telephonyManager.getSimOperator();

//new way - gives access to all SIMs
SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList();
for(SubscriptionInfo info : subInfoList) {
    int mcc = info.getMcc();
    int mnc = info.getMnc();

    //do some stuff...
}

我发现,因为它返回MCC和MNC的int,您会丢失一些MNC中的前导零。要查看一些示例,请查看此处的表格。当您配置MCC MNC时,您会得到SIM运算符,因此保持经常出现的零是很重要的。例如,墨西哥的NEXtel的SIM操作符值为“334090”,但是因为SubcriptionInfo返回MCC和MNC的int,所以您将分别获得值334和90。

鉴于此问题,如何将SubscriptionInfo的MCC MNC对可靠地链接到已知SIM运营商列表中的特定SIM运营商?这是API设计中的一个疏忽吗?对于多SIM手机中的每一张SIM卡,是否有其他方法可以获得SIM卡运营商?

共有2个答案

咸星波
2023-03-14

实现这一点的最佳方法是从SIM卡读取IMSI。如果您正在直接读取MNC MNC,并且您的用户正在漫游或连接到另一个网络,则返回的值将不可靠。

例如,如果您的用户是NEXTEL客户,但正在旅行或由于网络连接问题连接到另一个网络,比如Telcel,则MCC MNC返回的值将来自Telcel。

为了使当前SIM卡的操作员与预定义列表可靠匹配,请使用电话管理器中的getSubscriptionId()从SIM卡读取IMSI值。

IMSI以操作者的MCC MNC开始。您可以轻松地检查MCC MNC是否匹配,如下所示

final String mccMncToCompare = "334090"; //You can also use Integer instead of string. You just have to perform type conversion
final TelephonyManager tm = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
final String imsi= tm.getSubscriberId();
final boolean mccMncMatched = imsi.startsWith(mccMncToCompare);
夏谦
2023-03-14

MCC总是3位数字,其余的是MNC,正如你正确地说的,可能有2或3位数字。

如果将int解析为String,则只需获取它的子字符串并根据需要处理信息。

这也是一个隐藏的方法,但是你可以通过反射来访问它,以字符串格式获取你想要的信息,这至少存在于Android6和Android7中

public String getSimOperator(int subId)

但我认为SubscriptionManager的方式更安全,因为它是开放API,目前你不需要担心Android版本会以不同的方式处理它。

 类似资料:
  • 我仍然在使用Netty 3.10。我写了一个单元测试来检查Netty boss线程的性能。我在单元测试主线程中使用一个简单的Netty服务器引导程序,并在缓存的线程池中生成100个Javasync-IO客户端。我注意到我认为奇怪的性能下降。每个客户端都打开一个套接字,写入数据并关闭,关闭后记录持续时间(毫秒)。我的单元测试是附加的。我的单元测试的典型输出是,按照给定的顺序: 43 x客户端已完成。

  • 问题内容: 我一直在尝试可以在网上找到的所有内容,但没有任何效果。希望大家能看到新的问题。这是我第一次使用ActionCable,在本地一切正常,但是当推送到heroku时。我的日志没有像我的开发服务器那样显示任何可操作的订阅: 在发送消息时,我确实看到了,但没有将它们追加,这是在猜测是否意味着未访问/调用该方法? 我确实在heroku的日志中注意到它说,开发人员正在localhost:3000监

  • 问题内容: 我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做: 但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能: 返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。 编辑:列NUMER为INT(19)并已包含如下数据: (目前,它已填充了3到7位不同长度的数据) 问题答案: 我认为您应该考虑阅读的指南适用于发票的

  • 使用web3.eth.subscribe()方法来订阅区块链上的指定事件。 调用: web3.eth.subscribe(type [, options] [, callback]); 参数: type:String - 订阅类型 options:Mixed - 可选的额外参数,依赖于订阅类型 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个参数为结果 返回

  • > 使用改型的API类 UseCase类 null null MainClass.kt 应用程序运行时: 如果api返回NULL,将调用retryWhen(),然后再次调用api。达到事件not超时,并且api返回not NUL结果->onSuccess被调用。这是RXJava中对retryWhen()运算符的正确处理。 我的问题: 如果我在mainclass.kt中编写一些测试方法(假装API改