Android 7.0 UICC 分析(三)
本文讲解UICCCardApplication
/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
根据UiccCard 对象和IccCardStatus 的IccCardApplicationStatus[] 数组创建UiccCardApplication 对象,其构造方法:
public UiccCardApplication(UiccCard uiccCard,
IccCardApplicationStatus as,
Context c,
CommandsInterface ci) {
if (DBG) log("Creating UiccApp: " + as);
mUiccCard = uiccCard;
.......
mCi = ci;
根据app_type类型实例化IccFileHandler和IccRecords
mIccFh = createIccFileHandler(as.app_type);
mIccRecords = createIccRecords(as.app_type, mContext, mCi);
if (mAppState == AppState.APPSTATE_READY) {
queryFdn();
queryPin1State();//查询PIN1码状态
}
mCi.registerForNotAvailable(mHandler, EVENT_RADIO_UNAVAILABLE, null);//注册消息EVENT_RADIO_UNAVAILABLE
}
app_type 卡类型,定义在IccCardApplicationStatus 类中
public enum AppType{
APPTYPE_UNKNOWN,
APPTYPE_SIM, //GSM卡
APPTYPE_USIM, //WCDMA卡
APPTYPE_RUIM, //CDMA卡
APPTYPE_CSIM,
APPTYPE_ISIM
}
app_state 卡状态,定义在IccCardApplicationStatus 类中
public enum AppState{
APPSTATE_UNKNOWN, //卡不存在
APPSTATE_DETECTED, //卡已经检测到
APPSTATE_PIN, //卡已经被PIN码锁定
APPSTATE_PUK, //卡已经被PUK码锁定
APPSTATE_SUBSCRIPTION_PERSO, //卡已经被网络锁定
APPSTATE_READY; //卡已经准备好了
}
PIN码的状态,定义在IccCardStatus 类中
public enum PinState {
PINSTATE_UNKNOWN, //PIN码状态不确定
PINSTATE_ENABLED_NOT_VERIFIED, //PIN码锁定,用户输入的PIN码错误,无法进入手机
PINSTATE_ENABLED_VERIFIED, //PIN码锁定,用户输入的PIN码正确,进入手机
PINSTATE_DISABLED, //没有进行PIN码锁定
PINSTATE_ENABLED_BLOCKED, //PIN码解锁失败,提示输入PUK码
PINSTATE_ENABLED_PERM_BLOCKED; //PUK码解锁失败后,永久锁定
}
SIM卡状态,定义在IccCardStatus 类中
public enum CardState {
CARDSTATE_ABSENT, //表示掉卡
CARDSTATE_PRESENT, //表示卡正常
CARDSTATE_ERROR; //表示卡出现了错误
}
PersoSubState 描述卡被网络锁定的信息,对国内用户来说意义不大;
createIccFileHandler() 方法根据app_type 创建不同的IccFileHandler 对象:
private IccFileHandler createIccFileHandler(AppType type) {
switch (type) {
case APPTYPE_SIM:
return new SIMFileHandler(this, mAid, mCi);
case APPTYPE_RUIM:
return new RuimFileHandler(this, mAid, mCi);
case APPTYPE_USIM:
return new UsimFileHandler(this, mAid, mCi);
case APPTYPE_CSIM:
return new CsimFileHandler(this, mAid, mCi);
case APPTYPE_ISIM:
return new IsimFileHandler(this, mAid, mCi);
default:
return null;
}
}
createIccRecords() 方法根据app_type 创建不同的IccRecords 对象:
private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) {
if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) {
return new SIMRecords(this, c, ci);
} else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){
return new RuimRecords(this, c, ci);
} else if (type == AppType.APPTYPE_ISIM) {
return new IsimUiccRecords(this, c, ci);
} else {
// Unknown app type (maybe detection is still in progress)
return null;
}
}
UICCApplication 类的更新方法update():
public void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) {
if (DBG) log(mAppType + " update. New " + as);
AppType oldAppType = mAppType;
AppState oldAppState = mAppState; if (mAppType != oldAppType) { //app_type 更新
if (mIccFh != null) { mIccFh.dispose();}
if (mIccRecords != null) { mIccRecords.dispose();}
mIccFh = createIccFileHandler(as.app_type);
mIccRecords = createIccRecords(as.app_type, c, ci);
} if (mAppState != oldAppState) { //app_state 更新
if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState);
// If the app state turns to APPSTATE_READY, then query FDN status,
//as it might have failed in earlier attempt.
if (mAppState == AppState.APPSTATE_READY) { //如果卡已经准备好
queryFdn();
queryPin1State();
}
notifyPinLockedRegistrantsIfNeeded(null); //发出PIN码锁定通知,所以监听者将会接收到此通知
notifyReadyRegistrantsIfNeeded(null);
}
}
}
Android 7.0 UICC 分析(三)的更多相关文章
- Android 7.0 UICC 分析(四)
本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...
- Android 7.0 UICC 分析(二)
本文讲解UiccCard类 /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCard.java U ...
- Android 7.0 UICC 分析(一)
UICC(Universal Intergrated Circuit Card) 框架 * Following is class diagram for uicc classes: * * UiccC ...
- Android 5.0 Uicc框架分析
已同步更新至个人blog: dxjia.cn Uicc框架 UICC框架是Android在4.1引入的,使的对卡的管理控制更加清晰.要了解这个UICC框架,需要从UiccController开始, ...
- android 休眠唤醒机制分析(三) — suspend
本文转自:http://blog.csdn.net/g_salamander/article/details/7988340 前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的第二个阶段 ...
- Android 7.0(牛轧糖)新特性
Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ...
- Android 8.0 功能和 API
Android 8.0 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 用户体验 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的 ...
- Android 7.0 行为变更
Android 7.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 如果您之前发布过 Android 应用,请注意 ...
- Android 7.0新特性
还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...
随机推荐
- 新华龙电子推出最新网络开发板(W5100&W5500方案)
2014/12/16 | Filed under: TCP/IP芯片 and tagged with: C8051, W5100, W5500, 新华龙电子, 网络开发板 42 Views 深圳新华龙 ...
- sublime 工具构建
1 Sublime Text 3 配置react语法校验 原文地址:https://segmentfault.com/a/1190000004369542?_ea=585496 终端安装 npm in ...
- C++ 随机数
#include <iostream> #include <stdlib.h> #include <time.h> #define random(a,b) (ran ...
- js实现继承的两种方式
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
- Python自动化 【第十五篇】:CSS、JavaScript 和 Dom介绍
本节内容 CSS javascript dom CSS position标签 fixed: 固定在页面的某个位置 relative + absolute: 相对定位 opacity:0.5 设置透明度 ...
- nginx修改配置后不生效的问题
nginx增加了新的server name配置,发现nginx -s reload之后总是不生效. http和https均可以打开页面,但是页面是别的server页面,使用的证书也是别的server的 ...
- android 简单打jar包
先建议一个moduel,先写一个下载图片代码: public class LoadTest extends AsyncTask<Void,Void,byte[]>{ public stat ...
- [MAC]用beamoff给VMware的Mac OS X 10.10.x加速
MAC OS X 10.10.x Yosemite在VMWare中实在是太慢了,卡出翔!好在高人多,请装beamoff!详见:https://github.com/JasF/beamoff.git C ...
- HTTP权威协议笔记-3.Http报文
3.1 报文流 http使用流入和流出来描述事物处理方向,报文包含:起始行.首部和主体. 3.2 起始行 起始行包含:请求行和回应行. 3.2.1请求行 请求行包含:方法.请求URL(描述了对哪个资源 ...
- python学习(解析python官网会议安排)
在学习python的过程中,做练习,解析https://www.python.org/events/python-events/ HTML文件,输出Python官网发布的会议时间.名称和地点. 对ht ...