只使用Android系统部分屏幕

问题描述:

我想在特定的android智能手机屏幕的一部分放置硬件键盘(就像Galaxy S7边缘键盘盖)。所以我需要android系统总是只使用未被键盘占用的屏幕部分,即使在全屏视频回放等等。但是一个服务需要能够处理由该屏幕占用的区域的触摸事件键盘。这不需要在启动时工作。只使用Android系统部分屏幕

解决方案可能使用股票android(具有root访问权限)或修改后的LineageOS。

我倾向于认为没有股票android的解决方案。

但是Android开源项目对于我来说太复杂了,无法找到开始修改的地方。窗口管理器服务,surfaceflinger或其他?

我的意图是修改surfaceflinger将是最一般的解决方案。修改surfaceflinger是否可能,或者是否与HAL和二进制blob的一部分静态链接?我希望surfaceflinger不要以任何方式处理触摸事件,对吧?

一个模糊的想法不会触及surfaceflinger是修改窗口管理器,要求surfaceflinger创建一个与本机尺寸较小的虚拟显示器,用它来代替原生虚拟显示器,然后将其粘贴到本地虚拟显示器上。

另一个想法是在窗口管理器中修改窗口的矩形。但我不知道这是否可能(尤其是全屏视频播放)。

触摸事件也需要修改。顺便说一下,窗口管理器是否会路由触摸事件?

有没有使用surfaceflinger直接绕过窗口管理器和我可能的修改的android的任何组件?例如,应用程序可能会询问surfaceflinger的屏幕尺寸/分辨率,或者窗口管理器是否发送此信息?

有没有更简单的方法?

任何提示?

我发现了一个更简单的解决方案。 Android的窗口管理器管理每个显示器的过扫描设置,例如为了限制系统使用的显示区域,wm命令可以在根shell中对其进行更改。这像一个魅力。

是的,窗口管理器将输入路由到顶部窗口。但我不知道如何以及在哪里,导致这个课堂是一个巨大的混乱,我不想再摆弄。

该文档甚至指出,触摸屏驱动程序暴露/ proc(或/ sys,我不记得)中的特定文件,其中包含有关固定软按钮位于何处以及它们应如何映射到linux key代码会强制系统自动使用它们。因此,使用在文件系统中创建这样一个条目的定制内核模块最终会实现这个诀窍。但它未经测试。

硬件键盘上的按钮按钮仅由专用服务处理,因此我将直接在此服务中直接读取/ dev/input/event。