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

相关推荐
ACP广源盛1392462567315 小时前
GSV2125D@ACP#GSV6125#HDMI 2.0 转 DisplayPort 1.4 转换器(带嵌入式 MCU)
嵌入式硬件·计算机外设·音视频
上大科技蔡生19 小时前
IU5925+CS2102 / CS2102 / IU5512:超级电容无线鼠标电源芯片方案
计算机外设·电脑·dcdc·超级电容·ldo·充电ic·无线鼠标电源方案
ACP广源盛1392462567319 小时前
GSV2202D@ACP#DisplayPort 1.4 到 HDMI 2.0 转换器(带嵌入式 MCU)
单片机·嵌入式硬件·计算机外设·音视频
划水的code搬运工小李1 天前
控制底盘采集环境数据(一)- 键盘控制
计算机外设
码韵1 天前
【生活常识】(一)部分常用接口的引脚定义
计算机外设
摇滚侠1 天前
Macbook,鼠标滚轮不丝滑,感觉别扭
计算机外设
小李做物联网1 天前
6.7基于单片机stm32物联网嵌入式项目程序开发之人脸健康检测系统
stm32·单片机·嵌入式硬件·物联网·计算机外设
一个平凡而乐于分享的小比特1 天前
OSD按键详解:显示器的“遥控菜单键”
计算机外设·硬件知识·osd
电脑小管家2 天前
蝰蛇鼠标驱动怎么安装?全型号驱动下载方法汇总
windows·驱动开发·计算机外设·电脑·游戏程序
Saniffer_SH2 天前
【每日一题】PCIe 里的 RefClk (Reference Clock) 到底是干什么的?
服务器·驱动开发·单片机·嵌入式硬件·fpga开发·计算机外设·硬件架构