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);
            }
        }
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM