Android16 EDLA 开机向导的锁屏设置页面,HDMI out 鼠标不显示问题分析解决

Android16 EDLA 开机向导的锁屏设置页面,HDMI out 鼠标不显示问题分析解决

文章目录

一、前言

Android EDLA 开机向导的锁屏密码设置页面,鼠标无法显示,无法正常跳过开机向导。

如下界面:

这个方案目前是未适配触摸,鼠标想点左边的键盘输入或者右边的Skip跳动都没办法。

后续分析发现主要是由于Android密码界面保护机制,启用屏幕内容安全保护

这种机制下,如果是使用adb软件进行投屏,投屏看到的界面是黑屏。

这个问题估计之前版本都有,只是我最近刚好搞Android16 EDLA项目而已,顺便记录一下解决思路和代码。

有兴趣的,可以收藏看看。

二、分析修改

1、dumpsys window | grep mFoc 分析

开机向导中,显示密码设置或者图案设置试的界面信息:

复制代码
C:\Users\As11040>adb shell
//设置Pin或者密码界面信息
W82B_A:/ # dumpsys window | grep mFoc
    mFocusedWindow=Window{2e334bb u0 com.android.settings/com.android.settings.password.SetupChooseLockPassword}
W82B_A:/ #

//设置图案界面信息
W82B_A:/ # dumpsys window | grep mFoc
    mFocusedWindow=Window{c797f3f u0 com.android.settings/com.android.settings.password.SetupChooseLockPattern}
W82B_A:/ #

两个不同的Activity,不显示鼠标的具体原因是一样的。

这里就 SetupChooseLockPassword 分析:

2、ChooseLockPassword 源码

packages/apps/Settings/src/com/android/settings/password/ChooseLockPassword.java

复制代码
public class ChooseLockPassword extends SettingsActivity {
    private static final String TAG = "ChooseLockPassword";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        findViewById(R.id.content_parent).setFitsSystemWindows(false);
        //界面默认设置加密模式!!!
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
    }
}

可以看到这里的Activity设置了 FLAG_SECURE 所以会导致投屏鼠标消失和adb投屏黑屏问题。

3、解决

(1)简单的方法就是直接去除FLAG_SECURE

把下面Activity这行代码删除就行。

复制代码
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

这样界面就不会进入启用屏幕内容安全保护了。没啥硬性要求,这样修改最简单。

(2)判断多屏界面的情况,去除密码模式
复制代码
import android.hardware.display.DisplayManager;
import android.view.Display;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        
        //getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        // 动态判断是否多屏模式,解决OUT界面看不见鼠标光标问题
        DisplayManager dm = getSystemService(DisplayManager.class);
        Display[] displays = dm.getDisplays();
        boolean isMultiDisplay = displays.length > 1;
        Log.d(TAG, "onCreate: isMultiDisplay=" + isMultiDisplay);
        // 单屏模式保留安全标志,多屏模式解除
        if (!isMultiDisplay) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        }
    }

这里多屏的情况,就不会黑屏或者鼠标消失;单屏的情况还是会进入启用屏幕内容安全保护模式。

三、其他

1、小结

上面投屏界面无法显示鼠标或者投屏,就是因为下面的代码:

复制代码
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

代码是Android 开发中用于 启用屏幕内容安全保护 的核心 API;

作用是 禁止当前 Activity 的屏幕内容被截图、录屏、投屏或通过其他方式窃取;

本质是给当前窗口添加 "安全标记",让系统限制对窗口内容的访问权限。

我们系统开发中,如果有禁止截屏、投屏的界面也可以加入这个flag标识。

2、Android16 EDLA HDMI OUT投屏默认通过设置

如果是板块测试,就要默认支持HDMI out,这就要适配系统的代码了。

该问题在Android16之前是没有的,这里记录一下。

可能不是所有平台都需要适配,一般TV或者商显估计需要适配。

https://blog.csdn.net/wenzhi20102321/article/details/15458338

相关推荐
一晌小贪欢15 小时前
Python键盘鼠标自动化库详解:从入门到精通
python·自动化·计算机外设·python鼠标·python键盘·python操控鼠标·python操控键盘
避避风港21 小时前
联想键盘失灵处理方法
计算机外设
fukai77222 天前
BetterDisplay Pro for Mac显示器增强工具
macos·计算机外设
dldw7773 天前
银河麒麟定制版系统奇葩问题之鼠标坏了,还原系统
计算机外设
ken22325 天前
在被窝里使用笔记本电脑,容易损坏键盘?
计算机外设·电脑
某林2125 天前
如何使用ROS 2与STM32进行串口通信,并实现通过键盘按键‘1’来控制LED灯开关
stm32·嵌入式硬件·计算机外设
阿昭L6 天前
计算机外设与CPU通信
汇编·计算机外设
Xxtaoaooo6 天前
从普通屏到 明基RD320U:一台显示器如何提升我的编码效率?
计算机外设·专业工具·明基rd320u·专业编程显示器·提效工具
扬道财经9 天前
中小手抓握鼠标推荐:罗技GPW4小狗版,为亚洲手型而生的“小尺寸旗舰”
计算机外设