0

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

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

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

但是Android开源项目太复杂了,我找不到地方开始修改。窗口管理器服务、surfaceflinger 还是其他?

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

一个不接触surfaceflinger的模糊想法是修改窗口管理器以要求surfaceflinger创建一个尺寸更小的虚拟显示器作为原生显示器,将其用于任何东西而不是原生显示器,并将其blit到原生显示器。

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

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

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

有没有更简单的方法?

有什么提示吗?

4

1 回答 1

0

我自己找到了一个更简单的解决方案。android 的窗口管理器管理每个显示的过扫描设置,例如,可以通过 root shell 中的 wm 命令更改这些设置,以限制系统使用的显示区域。这就像一个魅力。

是的,窗口管理器将输入路由到顶部窗口。但是我不知道如何以及在哪里,因为WindowManagerService课堂一团糟,我不想再摆弄了。

该文档甚至指出,触摸屏驱动程序在 /proc(或 /sys,我不记得)中公开特定文件,其中包含有关固定软按钮所在位置以及它们应如何映射到 linux 键码的信息,这将强制系统自动使用它们。因此,使用在文件系统中创建这样一个条目的自定义内核模块最终会成功。但它未经测试。

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

于 2017-08-04T06:23:46.730 回答