Android系统仅使用部分屏幕

时间:2017-08-02 09:44:50

标签: android screen android-windowmanager surfaceflinger

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

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

我倾向于认为没有针对股票安卓的解决方案。

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

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

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

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

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

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

有更简单的方法吗?

任何提示?

1 个答案:

答案 0 :(得分:0)

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

是的,窗口管理器将输入路由到顶部窗口。但我不知道如何以及在哪里,因为WindowManagerService课程是一个巨大的混乱,我不想再捣乱了。

文档甚至指出,触摸屏驱动程序暴露/ proc(或/ sys,我记不起)中的特定文件,其中包含有关固定软按钮所在位置以及应如何映射到linux密钥代码的信息会迫使系统自动使用它们。因此,使用在文件系统中创建此类条目的自定义内核模块最终会成功。但它没有经过测试。

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