SystemUI 锁屏点击通知解锁界面重叠(bouncer界面与锁屏第一界面)

本文主要探讨了Android系统中,点击锁屏通知时出现的Bouncer界面与锁屏界面重叠的问题。作者分析了问题产生的原因,并提出了两种解决方案:为Bouncer界面设置背景或在显示Bouncer前隐藏锁屏第一界面。文章选择了第二种方案并详细说明了在StatusBar.java文件中的修改逻辑,以避免界面层叠,提升用户体验。

不积跬步无以至千里

一.前摘

          其实这里是原生设计,google认为这样是正常的现象,设计的如此,但是咱们国内呢,考虑的看见界面层叠混乱,这样就感觉体验不好,因此认为需要改善,当然可以看大厂的手机确实都处理此问题,那咱们也处理一下吧。

二.分析

          这里说一下吧,其实这里会出现层叠主要是因为当点击通知的时候会调起锁屏的二级解锁界面即bouncer界面,而此时Bouncer界面又是透明背景,如果是帧布局的话,上一个布局的背景是透明的当然就会看到下一层了啊,所以这里就是这个逻辑造成,因此可以看到一些大厂的处理,其中处理有两种从根本性的解决这一类关于Bouncer界面与第一界面重叠的问题。

方案一:

Bouncer界面设置有背景,处理效果比较好当然就是毛玻璃化,Bouncer界面有背景当然就看不见下一层了,这种层叠的场景都不会出现了。

方案二:

因为是两个界面显示重叠了,因此就是在点击处理通知的时候要显示到解锁Bouncer界面之前把锁屏的第一界面收起来就可以了。

三.解决

咱们

<think>我们正在处理一个关于Android 14 SystemUI的问题:用户希望移除PIN解锁界面之前的滑动。在标准的Android流程中,当设备被唤醒时,用户首先看到的是滑动(也称为“无”状态),然后如果需要更高的安全性(如PIN、密码或图案),则用户需要向上滑动以进入安全界面Bouncer)。用户希望跳过这个滑动,直接显示PIN解锁界面。 根据提供的引用和之前的问题背景,我们可以分析如下: 引用[2]中提到了`KeyguardSecurityContainer.startDisappearAnimation`,这涉及到安全界面的动画。引用[3]提到了`hideKeyguardImpl`方法,这个方法用于隐藏界面。这些引用的显示和隐藏有关。 在Android SystemUI中,的显示流程由`KeyguardViewMediator`、`StatusBarKeyguardViewManager`和`KeyguardSecurityContainer`等类控制。滑动(也称为“无)和安全Bouncer)是分开的。我们的目标是跳过滑动,直接显示安全(PIN解锁界面)。 实现方法: 1. **修改的显示逻辑**:我们需要在设备唤醒时直接显示安全Bouncer),而不是先显示滑动。 2. **调整状态管理**:在`KeyguardViewMediator`中,有一个状态机管理的显示。我们需要确保在激活时,直接进入安全状态。 具体步骤(需要修改SystemUI源码并重新编译): 步骤1:在`StatusBarKeyguardViewManager`中,找到控制显示的方法。我们关注`showBouncer`和`showPrimaryBouncer`方法。 步骤2:修改逻辑,使得在显示时直接调用显示Bouncer的方法。 在`StatusBarKeyguardViewManager`中,有一个方法`showPrimaryBouncer`,它用于显示安全界面。我们可以在初始化时直接调用这个方法。 但是,我们需要注意,在显示过程中,有一个方法`onStartedWakingUp`(在`KeyguardViewMediator`中)会触发的显示。然后,在`StatusBarKeyguardViewManager`中,会通过`show`方法来显示。在`show`方法中,我们可能看到这样的逻辑: ```java public void show(Bundle options) { // ... 省略部分代码 if (mBouncer == null) { // 初始化Bouncer } // 通常,这里会先显示滑动(即mStatusBar.showKeyguard()),然后根据安全状态决定是否立即显示Bouncer // 我们的目标是在这里直接显示Bouncer } ``` 我们可以修改`show`方法,使其在显示时直接显示Bouncer,而不是等待滑动。 步骤3:修改`StatusBarKeyguardViewManager`的`show`方法,强制显示Bouncer。 但是,我们还需要考虑安全状态。在设备定时,如果安全是激活的(即需要PIN解锁),那么我们可以直接显示Bouncer。我们可以通过`KeyguardSecurityModel`来检查当前的安全模式。 修改示例(伪代码): ```java public void show(Bundle options) { // ... 原有的初始化代码 // 原有的显示滑动的代码可能如下: // mStatusBar.showKeyguard(); // 我们改为:如果当前需要安全解锁(比如不是无状态),则直接显示Bouncer if (needsBouncer()) { showPrimaryBouncer(true); // true表示立即显示 } else { // 否则,显示无的滑动 mStatusBar.showKeyguard(); } } ``` 但是,在Android 14中,可能还需要考虑其他状态,比如是否正在开机、是否正在打电话等。因此,我们需要谨慎处理。 另一种方法是修改`KeyguardViewMediator`的`handleShow`方法,让它直接触发显示Bouncer。但更常见的做法是在`StatusBarKeyguardViewManager`中处理。 步骤4:为了避免滑动出现,我们还需要确保在显示过程中不显示通知面板(因为滑动通常和通知面板在一起)。我们可以通过隐藏通知面板来实现。 然而,在直接显示Bouncer的情况下,通知面板通常是被隐藏的,所以这应该不是问题。 步骤5:重新编译SystemUI并部署。 注意:这个修改可能会影响用户体验,因为用户将无法在滑动上看到通知。因此,我们可能需要同时考虑如何将通知显示在安全上(但这超出了本次问题的范围)。 由于修改SystemUI需要系统级权限(root或刷入自定义Recovery),并且需要重新编译SystemUI模块,因此只适用于高级用户或自定义ROM开发者。 如果用户不想修改源码,也可以考虑使用第三方应用替换系统,但这种方法可能无法完全替代系统级的安全解锁。 参考引用: 引用[2]提到了`KeyguardSecurityContainer.startDisappearAnimation`,这可能是安全界面消失的动画,我们修改显示逻辑后,这个动画可能也需要调整以保持一致性。 引用[3]中的`hideKeyguardImpl`方法,我们可能需要在直接显示Bouncer时,确保滑动被正确隐藏(即跳过它,所以不需要显示,自然也不需要隐藏)。 总结修改步骤: 1. 反编译SystemUI APK(或直接在源码中修改)。 2. 找到`StatusBarKeyguardViewManager`的`show`方法。 3. 修改逻辑,在需要安全解锁时直接显示Bouncer(即调用`showPrimaryBouncer`)。 4. 重新编译并推送SystemUI APK到设备。 注意:由于不同厂商的定制,类名和方法可能有所不同,以上基于AOSP。 由于这个修改涉及系统核心功能,务必进行充分测试。 相关问题: 1. 如何修改Android SystemUI的源码? 2. 在Android中如何自定义通知的显示? 3. 如何避免直接显示安全时用户无法查看通知的问题? 4. Android的安全机制是如何工作的?</think>### Android 14 SystemUI 移除PIN解锁界面前的滑动Android 14中,滑动(Swipe Lock Screen)是默认的初始界面,用户需要上滑后才能进入PIN/密码解锁界面。根据您的需求,以下是完整的移除方案(需修改SystemUI源码): #### 核心修改点(基于AOSP源码) 1. **禁用滑动初始化** 修改文件:`/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java` ```java public void show(Bundle options) { // 注释掉滑动初始化 // mStatusBar.showKeyguard(); // 直接显示安全(PIN界面) if (mBouncer == null) { mBouncer = new KeyguardBouncer(...); } showPrimaryBouncer(true); // 强制立即显示PIN界面[^2] } ``` 2. **绕过滑动解锁流程** 修改文件:`/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java` ```java protected void onFinishInflate() { // 移除滑动解锁相关视图绑定 // mSwipeView = findViewById(R.id.keyguard_swipe_view); // 直接加载PIN解锁视图 mCurrentSecurityView = inflateSecurityView(SecurityMode.PIN); } ``` 3. **禁用滑动解锁动画** 修改文件:`/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java` ```java private void showPrimaryBouncer(boolean scrimmed) { // 跳过滑动动画 // startAppearAnimation(); // 直接显示PIN界面 mKeyguardView.setVisibility(View.VISIBLE); mKeyguardView.onResume(); // 激活PIN输入[^3] } ``` #### 实现原理 1. **流程对比** 原始流程: ```mermaid graph LR A[唤醒设备] --> B[显示滑动] B --> C{用户上滑} C --> D[显示PIN解锁界面] ``` 修改后流程: ```mermaid graph LR A[唤醒设备] --> D[直接显示PIN解锁界面] ``` 2. **关键类说明** - `StatusBarKeyguardViewManager`:视图总控制器 - `KeyguardBouncer`:管理PIN/密码等安全界面 - `KeyguardSecurityContainer`:安全验证视图容器 - `KeyguardPinView`:PIN输入界面具体实现 #### 注意事项 1. **兼容性处理** 在`KeyguardSecurityContainer`中添加设备状态检查: ```java if (!mDeviceInteractive) { reset(); // 设备未激活时不显示任何 } ``` 2. **通知栏影响** 移除滑动会导致通知栏不可见(原始设计中通知栏附着于滑动界面)。如需保留通知: ```java // 在KeyguardPinView布局中添加通知容器 <include layout="@layout/notification_stack_scroller" /> ``` 3. **生物识别集成** 如果设备支持指纹/人脸解锁,需在`KeyguardPinViewController`中增加回调: ```java mBiometricCallback = new BiometricAuthenticator() { public void onAuthenticationSucceeded() { dismiss(); // 生物识别成功时自动解锁 } }; ``` #### 验证方法 1. 使用ADB命令测试: ```bash adb shell am broadcast -a android.intent.action.SCREEN_OFF # 关闭幕 adb shell input keyevent KEYCODE_POWER # 唤醒设备 ``` 2. 检查日志关键词: ```bash adb logcat | grep -E "KeyguardBouncer|showPrimaryBouncer" ``` #### 备选方案(无需源码修改) 如果无法编译SystemUI,可通过以下ADB命令临时禁用滑动: ```bash adb shell settings put secure lockscreen_disabled 1 adb shell settings put secure lock_screen_allow_private_notifications 0 ``` > **注意**:此方法会完全禁用安全机制,仅适用于测试环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rom_Fisher

赠人玫瑰,手留余香。

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

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

打赏作者

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

抵扣说明:

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

余额充值