SystemUI获得SIM卡相关的mcc/mnc值,分两种情况讨论

1. 存储在SIM卡中的mcc/mnc

这个值是存储在SIM卡IMSI(国际移动用户识别码 International Mobile Subscriber Identification Number)中的固定值,不会被更改。有以下两种途径可以取得。

1.1 通过TelephonyManager获得

在TelephonyManager中有如下方法:

//TelephonyManager.java

/**

* Returns the MCC+MNC (mobile country code + mobile network code) of the

* provider of the SIM for a particular subscription. 5 or 6 decimal digits.

*

* Availability: SIM state must be {@link #SIM_STATE_READY}

*

* @see #getSimState

*

* @param subId for which SimOperator is returned

* @hide

*/

public String getSimOperatorNumeric(int subId) {

int phoneId = SubscriptionManager.getPhoneId(subId);

return getSimOperatorNumericForPhone(phoneId);

}

/**

* Returns the MCC+MNC (mobile country code + mobile network code) of the

* provider of the SIM for a particular subscription. 5 or 6 decimal digits.

*

*

* @param phoneId for which SimOperator is returned

* @hide

*/

public String getSimOperatorNumericForPhone(int phoneId) {

return getTelephonyProperty(phoneId,

TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "");

}

↓↓↓

由于subId并不固定,是根据放进sim卡槽时候的计数来统计的,但是如果相关类中有SubscriptionInfo对象的话,是可以直接取到的:

int subId = mSubscriptionInfo.getSubscriptionId();

另一种phoneId则比较简单了,它与sim卡数量有关,单卡时为0,双卡时根据sim slot位置分别取0和1。

1.2 通过SubscriptionInfo获得

在有些特殊情况下,比如SIM卡处于PIN码LOCK状态时,1.1所提到的方法是取不到的,这个时候只能通过SubscriptionInfo来取。

// SubscriptionInfo.java

/**

* @return the MCC.

*/

public int getMcc() {

return this.mMcc;

}

/**

* @return the MNC.

*/

public int getMnc() {

return this.mMnc;

}

注意,由于这个方法取到的mcc/mnc均为int值,比如中国联通的“46001”,则有mcc为“460”,mnc为“1”,与固定String字符串进行匹配比对的话,需要先将String拆分为两部分后分别强转成int型后才可进行比对。

2. SIM卡注册网络的mcc/mnc

非漫游情况下,注册网络的mcc/mnc就是SIM卡中存储的。但是如果你的SIM卡在其他国家并没有该运营商的基站,只能通过漫游到其他运营商的网络上维持服务时,注册网络的mcc/mnc对应的就是该运营商的值,与SIM卡无关了。

2.1 通过ServiceState获得

熟悉Android Telephony流程的朋友应该都知道,CS、PS域的注册状态,漫游状态,运营商名字的显示,网络模式等都是用模板类ServiceState.java来保存的。

SystemUI中有不少类都注册了PhoneStateListener这个callback,用来时刻关注设备的一些telephony相关状态,当网络服务状态有变化时,会回调其onServiceStateChanged(ServiceState serviceState)方法,这样我们就可以直接从ServiceState里面取了。

// ServiceState.java

/**

* Get current registered operator numeric id.

*

* In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit

* network code.

*

* @return numeric format of operator, null if unregistered or unknown

*/

/*

* The country code can be decoded using

* {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}.

*/

public String getOperatorNumeric() {

return mVoiceOperatorNumeric;

}

/**

* Get current registered voice network operator numeric id.

* @return numeric format of operator, null if unregistered or unknown

* @hide

*/

public String getVoiceOperatorNumeric() {

return mVoiceOperatorNumeric;

}

/**

* Get current registered data network operator numeric id.

* @return numeric format of operator, null if unregistered or unknown

* @hide

*/

public String getDataOperatorNumeric() {

return mDataOperatorNumeric;

}

一般来说,voice语音业务和data数据业务对应的OperatorNumeric是一样的,所以getOperatorNumeric()默认取了voice的。

2.2 通过监听Telephony广播获得

由于该Intent action为MTK新增的,故以下方法介绍均以MTK源码为基础。

上面的方法必须在voice与data均注册成功的前提下才能获得,但是在一些很特殊的环境下,比如SIM卡虽然漫游上了某个其他运营商的网络,但由于两家运营商之间并没有协议,导致无法注册上服务,此时voice和data取得的OperatorNumeric均为空的。

在MTK源码中,MtkServiceStateTracker在处理PLMN String即mcc/mnc时,会通过action为“TelephonyIntents.ACTION_LOCATED_PLMN_CHANGED”的广播,把它作为extra参数传递出去。

// MtkServiceStateTracker.java

private void updateLocatedPlmn(String plmn) {

if (((mLocatedPlmn == null) && (plmn != null)) ||

((mLocatedPlmn != null) && (plmn == null)) ||

((mLocatedPlmn != null) && (plmn != null) && !(mLocatedPlmn.equals(plmn)))) {

log("updateLocatedPlmn(),previous plmn= " + mLocatedPlmn + " ,update to: " + plmn);

Intent intent = new Intent(TelephonyIntents.ACTION_LOCATED_PLMN_CHANGED);

if (TelephonyManager.getDefault().getPhoneCount() == 1) {

intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);

}

intent.putExtra(TelephonyIntents.EXTRA_PLMN, plmn);

...

mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);

}

mLocatedPlmn = plmn;

}

由此可知,只要在需要取的类中,注册一个监听“ACTION_LOCATED_PLMN_CHANGED”的BroadcastReceiver就行了,在设备开机之后便可以第一时间拿到漫游网络的mcc/mnc值,具体如下:

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

final String action = intent.getAction();

if (action.equals(TelephonyIntents.ACTION_LOCATED_PLMN_CHANGED)) {

mLocatedPlmn = intent.getStringExtra(TelephonyIntents.EXTRA_PLMN);

// mLocatedPlmn即为漫游网络的mcc/mnc值,接下来用它操作即可

...

}

}

};

android mcc mnc,SystemUI如何获得SIM卡相关的mcc/mnc值相关推荐

  1. android获取到电信的手机号码,Android基站信息获取以及Sim卡相关信息获取

    概述: 本篇主要介绍Android获取基站信息的方式,除此之外,还有SIM卡相关字段获取,先介绍一些缩写的概念,后续更新代码的写法. 前言:之前有碰到一个需求,需要获取SIM卡的相关属性:IMSI号. ...

  2. Ansroid系统(262)---MTK安卓sim卡相关源码分析

    MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...

  3. MTK安卓sim卡相关源码分析

    最近由于一个sim卡相关的需求,就去了解了一下Android Sim卡相关的一些代码.在此记录一下. 简要说一下需求吧,需要在插拔卡的时候弹出对话框,提供界面让用户选择开启默认卡数据链接或者转移到另一 ...

  4. 物联网小课堂之模组SIM卡相关秘籍

    上期我们提到了模组的供电常识!这期物联网小课堂小编将给大家带来的是模组SIM卡相关的秘籍.(咳咳-.还是装装个样子--上课!起立!). 第一节:模组是否支持内置SIM卡,是否支持空中写卡功能 小编家( ...

  5. android通过sim卡获取本机号码,Android获取本机号码及Sim卡状态

    SIM卡存储的数据可分为四类: 第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等. 第二类是暂时存放的 ...

  6. Android 系统(258)---获取SIM卡手机号

    Android 获取SIM卡手机号 相信APP在开发中经常用到SIM卡手机号,经过一些测试分析,提供一下个人的理解分析.手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机 ...

  7. android sim卡联系人存储格式,如何在Android设备上将联系人复制到SIM卡

    如何将联系人复制到SIM卡 以下部分是将联系人从计算机和Android手机存储卡复制到Android上的SIM卡的简单步骤.准备?让我们开始吧. 步骤1.安装并运行此Android管理器 开始时,在您 ...

  8. Android 5.1以上双卡指定sim卡拨打电话

    直接上代码: /*** 指定sim卡拨打电话** @param phoneNumber* @param slotId 0:卡1 1:卡2*/public void callPhone(String p ...

  9. android 判断有无sim卡,Android判断手机里是否有SIM卡

    由于项目的需要,要判断手机里是否有sim卡.在网上找了一下资料结果发现,网上的资料很多都是一样的,都是判断sim卡的状态,把代码添加进去后发现不能满足需求.然后就自己看了一下文档.代码如下. /** ...

  10. android如何读取sim卡联系人信息,Android上如何获取手机和sim卡的联系人信息

    需求很明确,获取手机和sim的联系人信息.接口设计也很简介 public interface OnFetchContactsListener { void onFetcherContactsCompl ...

最新文章

  1. 04-dispatch_group
  2. 阿里老员工吐槽:新员工水平差!不服管理!还不加班!我要汇报经理让对方无法转正!...
  3. 最新Android系统版本与API等级对应关系表
  4. linux shell 脚本 查找文件,Linux Shell在目录下使用for循环结合if查找文件的巧用
  5. C# 中居然也有切片语法糖,太厉害了
  6. 【渝粤题库】陕西师范大学202101 公共政策学
  7. 汽车之家的安全框架,是如何从0到1搭建的?
  8. c++opencv显示中文_图像处理入门 100 题,有人把它翻译成了中文版!
  9. python kafka消费实时数据,python生产和消费kafka数据
  10. C#_delegate - 值参数和引用参数
  11. 动态规划--凑硬币问题
  12. Linux常用到的命令
  13. 2,一个人体姿态识别的项目实现
  14. 通达OA 商务平台OA2017新版本简易评测(图文)
  15. 我谈 Markdown
  16. 如何获取微信公众号的关注链接?
  17. java.net.UnknownHostException: localhsot
  18. 男人很容易喜欢一个女人,却不轻易深爱一个女人。
  19. 2004年秋浙江省计算机等级考试二级C 编程题(2)
  20. 信息系统项目管理师(2022年)—— 重点内容:10大管理、5大过程组、47个过程信息汇总

热门文章

  1. SpringCloud-Gateway网关
  2. AOJ-AHU-OJ-675 定位赛
  3. 360浏览器打不开微信的连接服务器,360浏览器打不开网页怎么办-解决360浏览器打不开网页的方法 - 河东软件园...
  4. My Forty-eighth Page - 组合 - By Nicolas
  5. 【华为云】python调用华为云API,获取token值
  6. 科比:你知道洛杉矶每天早上四点钟是什么样子吗?
  7. cuba-platform和jmix框架
  8. rpc error: code = Unimplemented desc =
  9. MOSS系列一 MOSS的安装
  10. 计算机科学导论二分法实验报告,二分法上机实验报告.doc