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 ...
随机推荐
- OpenGL学习笔记1——第一个程序
学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...
- 如何在RichTextBox中改变多个字符串的颜色以及字体
目标:传入目标富文本框以及需要查找的字符串,如果文本框中存在字符串,则改变其颜色和字体 可能因为这个问题比较简单,在网上找了很久,也没有一个好的方法.少有的一些方法,也只是改变第一个找到的字符串的颜色 ...
- SpingMVC ModelAndView, Model,Control以及参数传递
1.web.xml 配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class& ...
- django--静态文件(九)
1.要加载静态文件需要配置: setting.py BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STA ...
- spring下载及部署
网址http://repo.spring.io/release/org/springframework/spring Bean配置项 Id : 在IOC容器中此Bean唯一标识 Class : 要实例 ...
- MySQL 第九天(核心优化三)
一.昨天内容回顾 索引设计依据 与数据表有关系的sql语句都统计出来 where order by or等等条件的字段适当做索引 原则: 频率高的sql语句 执行时间长的sql语句 业务逻辑重要的sq ...
- List集合的remove一个对象的方法
import java.util.ArrayList;import java.util.List;class A{ public boolean equals(Object obj){ return ...
- .NET获取根目录方法
1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径 方法2.AppDomain.CurrentDomain.Ba ...
- python目录操作shutil
#coding:utf-8 import os import shutil #将aaa.txt的内容复制到bbb.txt shutil.copy('aaa.txt','bbb.txt') #将aaa. ...
- 使用JQuery Ajax请求,在Controller里获取Session
昨天在做项目的时候,两个平台之间的切换,虽然两个网站的Session都指向了同一台机子,但是通过Ajax方式来请求时,就是不能获取到Session的值. 在调试的过程中发现,原来是Session的Is ...