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