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 ...
随机推荐
- JAVA 多线程和并发学习笔记(三)
Java并发编程中使用Executors类创建和管理线程的用法 1.类 Executors Executors类可以看做一个“工具类”.援引JDK1.6 API中的介绍: 此包中所定义的 Execut ...
- Asp.net core 通过Models 生成数据库的方法
其实Getting Started当中有着详细的说明,https://docs.efproject.net/en/latest/platforms/aspnetcore/new-db.html ...
- Maven构建项目后项目报Error错误Java compiler level does not match the version of the installed Java project fac
项目->右键->Project Facets->修改facets中Java版本(下拉箭头出)为要用的版本 Maven构建项目需注意 1.项目右键->Preferences-&g ...
- THINKPHP中关于接口问题(客户端)
一 apk版本号 客户端发送get请求访问服务器端的控制器方法,通过用户传过来的用户名和密码. 二 服务器端通过客户端传入的user and password 去数据库进行查询,Success就生成 ...
- log4j输出日志到不同文件
1.先看log4j的配置文件 log4j.properties 没有此文件就在根目录下创建一个: log4j.rootLogger=INFO,R,Client log4j.appender.R=org ...
- Android IOS WebRTC 音视频开发总结(八十一)-- WebRTC靠谱吗?有没有适合的SDK推荐?
作者:blaker,最早发表在我们的微信公众和[编风网],详见[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn) ...
- hibernate的环境配置
1,首先把跟Hibernate相关的jar包导入到lib目录下: 2,写Javabean类 package chen.can.Dao; public class TRegister implement ...
- Datasnap Image
delphi用,不能与java.c#互相识别. procedure TServerMethods.UpdateDoc(ItemID : integer; doc : TStream); delphi用 ...
- 解除破解正版Kindle电子书籍的版权限制
解除破解正版Kindle电子书籍的版权限制(DRM). 方法并不复杂: 安装好Calibre电子书籍阅读管理软件: 在Calibre软件中安装好破解DRM插件:DRM: 把购买到的Kindle电子书籍 ...
- EM算法(2):GMM训练算法
目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法运用 EM算法(4):EM算法证明 EM算法(2):GMM训练算法 1. 简介 GMM模型全称为Ga ...