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 ...
随机推荐
- 安装boost库(Windows)
1. 下载 官网:http://www.boost.org/ 主页:https://sourceforge.net/projects/boost/ 当前最新版:V1.61.0 2. 编译 首先,生成b ...
- centos,apache运维经验
1.防止php木马在apache下跨站 在/etc/php.ini 中设置open_basedir=.:/tmp/ , (还需要加载网站所在的目录) 2.shell下搜索木马 find ./ -ty ...
- 如何将App程序发布到App Store?
见链接:http://my.oschina.net/u/1245365/blog/201920
- 【练习】oracel获取当前session的id方法
1. :: SYS; SID ---------- 2. :: SYS@ORA11GR2>SELECT USERENV('SID') FROM DUAL; USERENV('SID') ---- ...
- 移动web开发实践-css3(1)盒模型display:-webkit-box;的使用
提到移动布局不得不提到盒模型display:-webkit-box;这个属性,在移动布局中浮动已经不在重要,相反自适应成为主要的需求,所以display:-webkit-box;变得尤为重要. box ...
- Leetcode4:Median of Two Sorted Arrays@Python
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- projecteuler Summation of primes
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two milli ...
- LSTM 分类器笔记及Theano实现
相关讨论 http://tieba.baidu.com/p/3960350008 基于教程http://deeplearning.net/tutorial/lstm.html LSTM基本原理http ...
- 移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来. 做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且to ...
- css之z-index
要想z-index可以使用,就要配合定位元素使用即position 如果定位元素z-index没有发生嵌套: 1.后来居上的准则 2.哪个大,哪个上 例如 如果定位元素z-index发生嵌套: 1.祖 ...