本文讲解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 分析(三)的更多相关文章

  1. Android 7.0 UICC 分析(四)

    本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...

  2. Android 7.0 UICC 分析(二)

    本文讲解UiccCard类 /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCard.java U ...

  3. Android 7.0 UICC 分析(一)

    UICC(Universal Intergrated Circuit Card) 框架 * Following is class diagram for uicc classes: * * UiccC ...

  4. Android 5.0 Uicc框架分析

    已同步更新至个人blog:   dxjia.cn Uicc框架 UICC框架是Android在4.1引入的,使的对卡的管理控制更加清晰.要了解这个UICC框架,需要从UiccController开始, ...

  5. android 休眠唤醒机制分析(三) — suspend

    本文转自:http://blog.csdn.net/g_salamander/article/details/7988340 前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的第二个阶段 ...

  6. Android 7.0(牛轧糖)新特性

    Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ...

  7. Android 8.0 功能和 API

    Android 8.0 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 用户体验 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的 ...

  8. Android 7.0 行为变更

    Android 7.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 如果您之前发布过 Android 应用,请注意 ...

  9. Android 7.0新特性

    还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...

随机推荐

  1. linux出现user account has expired解决方案

    SUSE Linux 用户user1登陆不了,确认密码没错,使用root用户登陆,su - user1 提示密码不对,passwd user1提示帐户过期user account hasexpired ...

  2. Git self-learning

    ---恢复内容开始--- 使用后的总结 git config --global user.name "" #设置和查看用户名git config --global user.ema ...

  3. jquery 面板拖拽

    在网上找了好多的例子 都不满足我所需要 在网上找了一篇关于easyui是一个拓展的demo  然后根据demo 把我所需要的东西进行再次拓展 满足我的需求 也不多说了 上代码 首先 你肯定是要导eas ...

  4. ContentProvider小结

    1.什么情况下需要使用ContentProvider 跨进程提供数据访问的接口,如果在同一个App下,没有必要使用此种方式 2.自定义ContentProvider public class MyCo ...

  5. shallow copy 和 deep copy 的示例

    本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5481874.html   (Robin) Student package base; impo ...

  6. Bash注释

    1)单行注释: #!/bin/bash #echo "Martin" echo "Martin" #echo "Martin" 2)多行注释 ...

  7. linux系统的常用命令

    linux系统中常用的命令如下(以后经常补充): cd ..   返回上一级 cd use  进入use目录

  8. sqlserver如何关闭死锁进程.

    1.首先我们需要判断是哪个用户锁住了哪张表. --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity ...

  9. CSV文件的规范

    CSV文件,全程Comma-separated values,就是逗号分隔的数据文件.常用于数据集成的数据交换部分标准部分. 最近看到一个项目组在讨论接口文件CSV的规范,真是替他们着急.讨论点: 文 ...

  10. Li-Fi,LED光无线局域网

    无需WiFi信号,点一盏LED灯就能上网.昨天,复旦大学计算机科学技术学院传出好消 息,一种利用屋内可见光传输网络信号的国际前沿通讯技术在实验室成功实现.研究人员将网络信号接入一盏1W的LED灯珠,灯 ...