Android Framework定制sim卡插入解锁pin码的界面

news/2024/10/27 19:05:05/

文章目录

  • 手机设置SIM卡pin码
    • 一、安卓手机
    • 二、苹果手机
  • Android Framework中SIM卡pin码代码
    • 定位pin码提示文本位置
    • 定位pin码java代码位置
  • 定制pin码framework窗口
    • 数字按钮

手机设置SIM卡pin码

设置 SIM 卡 PIN 码可以提高手机的安全性,防止他人在未经授权的情况下使用你的 SIM 卡。但请务必牢记你的 PIN 码,因为连续多次输入错误的 PIN 码可能会导致 SIM 卡被锁定,需要使用 PUK 码解锁。如果你忘记了 PIN 码或 PUK 码,应及时联系你的运营商获取帮助。

以下介绍怎么在手机上开启锁定SIM卡并设置pin码。

一、安卓手机

  1. 打开手机 “设置”。
  2. 在设置中找到 “安全” 或 “密码与安全” 等选项。
  3. 点击进入后,查找 “SIM 卡锁定” 或类似名称的选项。
  4. 进入该选项后,你可能需要输入手机的解锁密码、指纹或面部识别等进行验证。
  5. 验证通过后,开启 “锁定 SIM 卡” 开关。
  6. 此时会提示你输入初始的 PIN 码,一般初始 PIN 码为 “1234” 或 “0000”,具体可咨询运营商。输入正确的初始 PIN 码后点击确定。
  7. 接着你可以设置新的 PIN 码,输入新的 PIN 码并确认。

二、苹果手机

  1. 打开手机 “设置”。
  2. 点击 “蜂窝网络”。
  3. 选择你要设置 PIN 码的 SIM 卡。
  4. 点击 “SIM 卡 PIN 码”。
  5. 开启 “SIM 卡 PIN 码” 开关。
  6. 输入初始 PIN 码(通常为 “1234” 或 “0000”),然后点击 “完成”。
  7. 设置新的 PIN 码并确认。

Android Framework中SIM卡pin码代码

如图打开SIM卡锁定并后,再插入SIM会弹出窗口,要求输入pin码。重启开机锁屏画面也是显示这个:
在这里插入图片描述
可以根据提示文本来定位代码在哪。

定位pin码提示文本位置

find frameworks/base/ -name “*.xml” | xargs grep “请输入 SIM”

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="one">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:    <string name="kg_simlock_instructions">请输入 SIM LOCK 解锁密码</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"请输入 SIM 卡 PUK 码和新的 PIN 码"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"请输入 SIM 卡 PIN 码。"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>

其中最有可能的是这两处

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>

打开第二个查看具体内容
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml

    <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818"><item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item><item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item></plurals>

得到关键字
kg_password_default_pin_message

java_55">定位pin码java代码位置

通过上面的关键字,在.java文件中搜索,可定位到java代码

find frameworks/base/ -name "*.java" | xargs grep "kg_password_default_pin_message"
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message :
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :

frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
这段代码是针对不同情况获取到不同的提示文本。

java">    private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) {String displayMessage;int msgId;if (attemptsRemaining == 0) {// 这里是尝试多次pin码都错误情况下的错误提示displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);} else if (attemptsRemaining > 0) {// 这里是还有可尝试输入pin码的次数情况int count = TelephonyManager.getDefault().getSimCount();if (count < 2) {msgId = isDefault ? R.plurals.kg_password_default_pin_message :R.plurals.kg_password_wrong_pin_code;displayMessage = getContext().getResources().getQuantityString(msgId, attemptsRemaining, attemptsRemaining);} else {msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :R.plurals.kg_password_wrong_pin_code_multi;int phoneId = SubscriptionManager.getPhoneId(mSubId);SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class).getSubscriptionInfoForSubId(mSubId);Log.d(LOG_TAG, "phoneId : " + phoneId + "; mSubId : " + mSubId + "; info : " + info);if (info!= null && !SubscriptionManager.isValidPhoneId(phoneId)) {phoneId = info.getSimSlotIndex();Log.d(LOG_TAG, "SubscriptionInfo:"+info.toString() + "; phoneId : " + phoneId);}displayMessage = getContext().getResources().getQuantityString(msgId,attemptsRemaining, phoneId + 1, attemptsRemaining);}} else {msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed;displayMessage = getContext().getString(msgId);}if (KeyguardEsimArea.isEsimLocked(mContext, mSubId)) {displayMessage = getResources().getString(R.string.kg_sim_lock_esim_instructions, displayMessage);}if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"+ " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);return displayMessage;}

在SystemUI目录下搜索,发现如下这些地方,有多处,代表锁屏时不同的窗口
在这里插入图片描述

这是由KeyguardSecurityContainer.java中判断,调用哪个layout的view, 对应上面的不同view

java">    private int getSecurityViewIdForMode(SecurityMode securityMode) {switch (securityMode) {case Pattern: return R.id.keyguard_pattern_view;case PIN: return R.id.keyguard_pin_view;case Password: return R.id.keyguard_password_view;case SimPin: return R.id.keyguard_sim_pin_view;case SimPuk: return R.id.keyguard_sim_puk_view;// Unisoc: Support for SimLockcase SimLock: return !mHideSimLockView? R.id.keyguard_simlock_view : R.id.keyguard_operator_simlock_view;/* For SubsidyLock feature @{ */case SubsidyLock_Lock: return R.id.keyguard_subsidylock_lock_view;case SubsidyLock_EnterCode: return R.id.keyguard_subsidylock_entercode_view;case SubsidyLock_Init: return R.id.keyguard_subsidylock_init_view;/* @} */}return 0;}

这里就是要求用户输入pin码的弹窗代码
KeyguardSimPinView.java, 此类继承自KeyguardPinBasedInputView.java,再上一层父类是KeyguardAbsKeyInputView.java

先只看KeyguardSimPinView.java的代码
如下是设置文本提示的地方,调用上面提到的getPinPasswordErrorMessage

java">setLockedSimMessage() {if (mSecurityMessageDisplay != null && getVisibility() == VISIBLE) {if (msg == null) {msg = getPinPasswordErrorMessage(mRemainingAttempts, true);} else {msg = msg.concat(getPinPasswordErrorMessage(mRemainingAttempts, true));}mSecurityMessageDisplay.setMessage(msg);}
}

它对应的layout是这个
keyguard_sim_pin_view.xml

<com.android.keyguard.KeyguardSimPinViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:androidprv="http://schemas.android.com/apk/res-auto"android:id="@+id/keyguard_sim_pin_view"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"androidprv:layout_maxWidth="@dimen/keyguard_security_width"androidprv:layout_maxHeight="@dimen/keyguard_security_max_height"android:gravity="center_horizontal"><!-- 这个是sim卡的图标 --><ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:src="@drawable/ic_lockscreen_sim"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="vertical"android:gravity="center"android:layout_weight="1"android:layoutDirection="ltr"><!-- 停用 eSIM 卡提示,默认不显示 --><include layout="@layout/keyguard_esim_area"android:id="@+id/keyguard_esim_area"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="@dimen/eca_overlap" /><RelativeLayoutandroid:id="@+id/row0"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:paddingBottom="16dp"><!-- 密码输入框 --><com.android.keyguard.PasswordTextViewandroid:id="@+id/simPinEntry"android:layout_width="@dimen/keyguard_security_width"android:layout_height="match_parent"android:gravity="center"android:layout_centerHorizontal="true"android:layout_marginRight="72dp"androidprv:scaledTextSize="@integer/scaled_password_text_size"android:textColor="?attr/wallpaperTextColor"android:contentDescription="@string/keyguard_accessibility_sim_pin_area"/><Viewandroid:id="@+id/divider"android:layout_width="match_parent"android:layout_height="1dp"android:layout_alignParentBottom="true"android:background="@drawable/pin_divider"/></RelativeLayout><!-- 数字1到9 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key1"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="1"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key2"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="2"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key3"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="3"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key4"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="4"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key5"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="5"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key6"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="6"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="1"><com.android.keyguard.NumPadKeyandroid:id="@+id/key7"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="7"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key8"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="8"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key9"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="9"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><!-- 删除按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/delete_button"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_delete"style="@style/Keyguard.ImageButton.NumPadDelete"/><!-- 数字0 --><com.android.keyguard.NumPadKeyandroid:id="@+id/key0"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="0"/><!-- 确认输入按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/key_enter"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"style="@style/Keyguard.ImageButton.NumPadEnter"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_enter"/></LinearLayout></LinearLayout><!-- keyguard_eca,它实际是一个引用,指向另一个layout,引用说明在values-land/alias.xml中,代表紧急拔号的ui --><include layout="@layout/keyguard_eca"android:id="@+id/keyguard_selector_fade_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_gravity="bottom|center_horizontal"android:gravity="center_horizontal"/><!-- UNISOC: Add for SubsidyLock @{ --><TextViewstyle="?android:attr/buttonBarButtonStyle"android:id="@+id/kg_simpin_dismiss_button"android:layout_width="wrap_content"android:layout_marginTop="@dimen/eca_overlap"android:layout_height="wrap_content"android:text="@string/simlock_dismiss" <!-- 取消 -->android:textAppearance="?android:attr/textAppearanceMedium"android:textSize="@dimen/kg_status_line_font_size"android:textColor="?attr/wallpaperTextColor"android:textAllCaps="@bool/kg_use_all_caps"android:visibility="gone"/><!-- @} --></com.android.keyguard.KeyguardSimPinView>

framework_370">定制pin码framework窗口

定位到代码后,就可以进行替换
如果把这个layout放到Android Studio中预览,就是如图的样子:
在这里插入图片描述
知道layout就可以做针对性的修改了,
比如不要显示最上方的sim卡图标,则在layout中加个android:visibility=“gone”
详情如下:

    <ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:visibility="gone"android:src="@drawable/ic_lockscreen_sim"/>

比如要改数字按钮,则就改com.android.keyguard.NumPadKey

数字按钮

代码NumPadKey.java

java">    public NumPadKey(Context context, AttributeSet attrs, int defStyle) {this(context, attrs, defStyle, R.layout.keyguard_num_pad_key);}

layout keyguard_num_pad.key.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/digit_text"style="@style/Widget.TextView.NumPadKey"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/klondike_text"style="@style/Widget.TextView.NumPadKey.Klondike"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</merge>

修改layout就会影响数字的样式。

作者:帅得不敢出门


http://www.ppmy.cn/news/1542405.html

相关文章

MySQL--基本介绍

一.数据库前言 1.数据库的相关介绍 关系数据库管理系统&#xff08;Relational Database Management System&#xff1a;RDBMS&#xff09;是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库&#xff0c;并将数…

血量更新逻辑的实现

来实现一下减血的逻辑 首先我们来看一下&#xff0c;我们再HealthBar当中的填充&#xff0c;填充的时候&#xff0c;我们会调用FillAmount这个变量&#xff0c; 学习调用组件&#xff0c;我们可以选择右上角的问号&#xff0c;跳转到代码手册当中&#xff0c;快速了解这些功能…

昇思25天学习打卡营第1天|快速入门

昇思25天学习打卡营第1天|快速入门 目录 昇思25天学习打卡营第1天|快速入门实操教程 一、MindSpore内容简介 主要特点&#xff1a; MindSpore的组成部分&#xff1a; 二、入门实操步骤 1. 安装必要的依赖包 2. 下载并处理数据集 3. 构建网络模型 4. 训练模型 5. 测试…

Nova-Admin:基于Vue3、Vite、TypeScript和NaiveUI的开源简洁灵活管理模板

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 Nova Admin是一个基于Vue3、Vite、TypeScript和NaiveUI的简洁灵活的管理模板。这个项目旨在为开发者提供一个现代化、易于定制的后台管理界面解决方案。无…

算法汇总整理篇——贪心与动态规划学习及框架思考

算法的知识储备 动态规划算法(重中之重) 如果某⼀问题有很多重叠⼦问题&#xff0c;使⽤动态规划是最有效的动规是由前⼀个状态推导出来的&#xff0c;⽽贪⼼是局部直接选最优的 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2. 确定递推公式 3. dp数组如何初…

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析 这是一篇发表在CVPR 2023的一篇论文&#xff0c;因为自己本身的研究方向是目标跟踪&#xff0c;之前看了一点使用扩散模型进行多跟踪的论文&#xff0c;里面提到了DiffusionDet因此学习一…

LabVIEW共享变量通信故障

问题概述&#xff1a; 在LabVIEW项目中&#xff0c;使用IO服务器创建共享变量&#xff0c;并通过LabVIEW作为从站进行数据通信。通讯在最初运行时正常&#xff0c;但在经过一段时间或几个小时后&#xff0c;VI前面板出现错误输出&#xff0c;导致数据传输失败。虽然“分布式系统…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f;下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…