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