【问题标题】:Android system use only Part of the ScreenAndroid系统仅使用部分屏幕
【发布时间】:2017-08-02 09:44:50
【问题描述】:

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

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

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

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

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

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

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

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

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

有没有更简单的方法?

有什么提示吗?

【问题讨论】:

    标签: android screen android-windowmanager surfaceflinger


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2011-12-10
      • 2011-10-06
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多