android mcc mnc,SystemUI如何获得SIM卡相关的mcc/mnc值
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值相关推荐
- android获取到电信的手机号码,Android基站信息获取以及Sim卡相关信息获取
概述: 本篇主要介绍Android获取基站信息的方式,除此之外,还有SIM卡相关字段获取,先介绍一些缩写的概念,后续更新代码的写法. 前言:之前有碰到一个需求,需要获取SIM卡的相关属性:IMSI号. ...
- Ansroid系统(262)---MTK安卓sim卡相关源码分析
MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...
- MTK安卓sim卡相关源码分析
最近由于一个sim卡相关的需求,就去了解了一下Android Sim卡相关的一些代码.在此记录一下. 简要说一下需求吧,需要在插拔卡的时候弹出对话框,提供界面让用户选择开启默认卡数据链接或者转移到另一 ...
- 物联网小课堂之模组SIM卡相关秘籍
上期我们提到了模组的供电常识!这期物联网小课堂小编将给大家带来的是模组SIM卡相关的秘籍.(咳咳-.还是装装个样子--上课!起立!). 第一节:模组是否支持内置SIM卡,是否支持空中写卡功能 小编家( ...
- android通过sim卡获取本机号码,Android获取本机号码及Sim卡状态
SIM卡存储的数据可分为四类: 第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等. 第二类是暂时存放的 ...
- Android 系统(258)---获取SIM卡手机号
Android 获取SIM卡手机号 相信APP在开发中经常用到SIM卡手机号,经过一些测试分析,提供一下个人的理解分析.手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机 ...
- android sim卡联系人存储格式,如何在Android设备上将联系人复制到SIM卡
如何将联系人复制到SIM卡 以下部分是将联系人从计算机和Android手机存储卡复制到Android上的SIM卡的简单步骤.准备?让我们开始吧. 步骤1.安装并运行此Android管理器 开始时,在您 ...
- Android 5.1以上双卡指定sim卡拨打电话
直接上代码: /*** 指定sim卡拨打电话** @param phoneNumber* @param slotId 0:卡1 1:卡2*/public void callPhone(String p ...
- android 判断有无sim卡,Android判断手机里是否有SIM卡
由于项目的需要,要判断手机里是否有sim卡.在网上找了一下资料结果发现,网上的资料很多都是一样的,都是判断sim卡的状态,把代码添加进去后发现不能满足需求.然后就自己看了一下文档.代码如下. /** ...
- android如何读取sim卡联系人信息,Android上如何获取手机和sim卡的联系人信息
需求很明确,获取手机和sim的联系人信息.接口设计也很简介 public interface OnFetchContactsListener { void onFetcherContactsCompl ...
最新文章
- 04-dispatch_group
- 阿里老员工吐槽:新员工水平差!不服管理!还不加班!我要汇报经理让对方无法转正!...
- 最新Android系统版本与API等级对应关系表
- linux shell 脚本 查找文件,Linux Shell在目录下使用for循环结合if查找文件的巧用
- C# 中居然也有切片语法糖,太厉害了
- 【渝粤题库】陕西师范大学202101 公共政策学
- 汽车之家的安全框架,是如何从0到1搭建的?
- c++opencv显示中文_图像处理入门 100 题,有人把它翻译成了中文版!
- python kafka消费实时数据,python生产和消费kafka数据
- C#_delegate - 值参数和引用参数
- 动态规划--凑硬币问题
- Linux常用到的命令
- 2,一个人体姿态识别的项目实现
- 通达OA 商务平台OA2017新版本简易评测(图文)
- 我谈 Markdown
- 如何获取微信公众号的关注链接?
- java.net.UnknownHostException: localhsot
- 男人很容易喜欢一个女人,却不轻易深爱一个女人。
- 2004年秋浙江省计算机等级考试二级C 编程题(2)
- 信息系统项目管理师(2022年)—— 重点内容:10大管理、5大过程组、47个过程信息汇总
热门文章
- SpringCloud-Gateway网关
- AOJ-AHU-OJ-675 定位赛
- 360浏览器打不开微信的连接服务器,360浏览器打不开网页怎么办-解决360浏览器打不开网页的方法 - 河东软件园...
- My Forty-eighth Page - 组合 - By Nicolas
- 【华为云】python调用华为云API,获取token值
- 科比:你知道洛杉矶每天早上四点钟是什么样子吗?
- cuba-platform和jmix框架
- rpc error: code = Unimplemented desc =
- MOSS系列一 MOSS的安装
- 计算机科学导论二分法实验报告,二分法上机实验报告.doc