Android Framework SIM卡PIN码解锁代码流程

SIM PIN简述

SIM卡打开PIN码锁定后,插入SIM卡,或插入后重启手机,会弹出一个锁定窗口,要求输入PIN码解锁手机屏幕。本文讲述是安卓Framework中的代码是如何实现这个锁定与解锁的。
可以参考我的另一篇文章Android Framework定制sim卡插入解锁pin码的界面

SIM卡PIN码锁定时如图
在这里插入图片描述

SIM卡PIN码锁定代码分析

通过logcat打印,可以大致了解调用过程,
KeyguardUpdateMonitor检测到SIM卡是LOCK状态,调用KeyguardViewMediator.handleSimStateChange函数

KeyguardUpdateMonitor   com.android.systemui                 D  handleSimStateChange(subId=-1, slotId=0, state=0)
2024-10-26 14:57:06.072 21465-21465 KeyguardViewMediator    com.android.systemui                 D  onSimStateChanged(subId=3, slotId=0,state=2)
2024-10-26 14:57:06.073 21465-21465 KeyguardViewMediator    com.android.systemui                 D  INTENT_VALUE_ICC_LOCKED and keygaurd isn't showing; need to show keyguard so user can enter sim pin
2024-10-26 14:57:06.078 21465-21465 KeyguardViewMediator    com.android.systemui                 D  doKeyguard: showing the lock screen
2024-10-26 14:57:06.078 21465-21465 KeyguardViewMediator    com.android.systemui                 D  showLocked
2024-10-26 14:57:06.081 21465-21465 CarrierTextController   com.android.systemui                 D  onSimStateChanged: SimLocked

调用显示锁屏的窗口,过渡到KeyguardSecurityView类处理

2024-10-26 14:57:06.119 21465-21465 KeyguardViewMediator    com.android.systemui                 D  handleShow
2024-10-26 14:57:06.123 21465-5952  KeyguardViewMediator    com.android.systemui                 D  updateActivityLockScreenState(true, false)
2024-10-26 14:57:06.155 21465-21465 KeyguardSecurityView    com.android.systemui                 V  showPrimarySecurityScreen(turningOff=false)
2024-10-26 14:57:06.155 21465-21465 KeyguardSecurityView    com.android.systemui                 D  showSecurityScreen(SimPin)

最终显示是由KeyguardSimPinView类实现的

2024-10-26 14:57:06.196 21465-21465 KeyguardSimPinView      com.android.systemui                 V  SimPinView is onResume, PasswordTextView should get focus
2024-10-26 14:57:06.197 21465-21465 KeyguardSimPinView      com.android.systemui                 V  Resetting state

锁定的窗口初始显示

锁定窗口是这个类实现的KeyguardSimPinView.java,
这个窗口上面是一个文本显示提示信息,下面数字输入键盘按钮。
frameworks/base/packages/SystemU/src/com/android/keyguard/KeyguardSimPinView.java
showDefaultMessage 用来显示初始信息,主要是这张卡还有多少次解锁重试次数

    private void showDefaultMessage() {
   
        int slotId = SubscriptionManager.getSlotIndex(mSubId);
        if (!SubscriptionManager.isValidPhoneId(slotId)) {
   
            Log.d(LOG_TAG, "Invalid slotId " + slotId);
            return;
        }
        setLockedSimMessage();
        if (mRemainingAttempts >= 0) {
    // 重试次数不足
            return;
        }

        int remainTimesFromProp = getPinRemainTimes(); // 先尝试获取当前还有几次重试次数
        if (remainTimesFromProp == INVALID_REMAINTIMES) {
   
            // 如果未获取到次数,则通过发送空的PIN码获取SIM卡的解锁次数,这里与上面的获取方式是不一样的
            // Sending empty PIN here to query the number of remaining PIN attempts
            new CheckSimPin("", mSubId) {
   
                void onSimCheckResponse(final PinResult result) {
   
                    Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result "
                            + result.toString());
                    if (result.getAttemptsRemaining() >= 0) {
   
                        mRemainingAttempts = result.getAttemptsRemaining();
                        setLockedSimMessage();
                    }
                }
            }.start();
        }
    }

    // 这个函数是先尝试调的获取剩余解锁次数的函数
    private int getPinRemainTimes() {
   
        int remainTimes = INVALID_REMAINTIMES;
        if (mContext != null) {
   
            SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class).
                    getSubscriptionInfoForSubId(mSubId);
            if (info != null) {
   
                String propertyValue = TelephonyManager.from(mContext)
                        .getTelephonyProperty(info.getSimSlotIndex(), PROPERTY_PIN_REMAINTIMES, "");
                if (!TextUtils.isEmpty(propertyValue)) {
   
                    try {
   
                        remainTimes = Integer.valueOf(propertyValue);
                    } catch (NumberFormatException e) {
   
                        e.printStackTrace();
                    }
                }
            }
        }
        Log.d(LOG_TAG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值