【问题标题】:Android 10 injecting inputs to External Display / Virtual DisplayAndroid 10 向外部显示器/虚拟显示器注入输入
【发布时间】:2020-12-01 16:55:23
【问题描述】:

概念:

我有一个用 Kotlin 编写的 Android 应用程序,它只是在外部显示器上启动一个 Android 应用程序。显示器可以是 AirServer、Miracast、Microsoft Connect、USB-OTG HDMI、USB-C HDMI 或模拟辅助显示器(见屏幕截图)。

这是执行“繁重”的代码的例外:

        val intent = packageManager.getLaunchIntentForPackage(info.id)
        val dm = recyclerView.context.getSystemService(Service.DISPLAY_SERVICE) as DisplayManager
        val displays = dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION)

        for (display in displays) {
            val options = ActivityOptions.makeBasic()
            options.launchDisplayId = display.displayId
            recyclerView.context.startActivity(intent, options.toBundle())
            break
        }

应用程序启动良好。查看屏幕截图,我用它来将 Minecraft Pocket Edition 启动到模拟辅助显示器(就像连接了外部 HDMI 显示器一样)。问题是我无法将触摸或光标输入发送到虚拟显示器。

什么有效:

  • adb shell input -d <display-id> tap <x> <y>
  • 无线控制器
  • 无线键盘

什么不起作用:

  • 无线/有线鼠标(光标碰到手机屏幕边缘,从不进入虚拟显示器/外接显示器屏幕)
  • 触摸(见截图)

我的尝试:

dumpsys display 的输出表明虚拟显示器都缺少内部显示器所具有的touch VIRTUAL 参数。我不确定这是否意味着显示器本身不支持触摸屏输入,或者它根本没有启用。

我尝试强制应用程序进入前台,这使应用程序检测到键盘和控制器输入,但光标仍锁定在内部显示窗口。

值得注意的是,Android 10 桌面模式开发者设置 DOES 将光标置于外部显示器而不是内部显示器。这就是我想要完成的。

Androids SDK 中似乎有一个隐藏的 Java API:

https://github.com/aosp-mirror/platform_frameworks_base/blob/a4ddee215e41ea232340c14ef92d6e9f290e5174/services/core/jni/com_android_server_input_InputManagerService.cpp#L825

我尝试通过反射访问此类并调用 setFocusedDisplay,但我不断收到 ClassNotFound 异常,即使更改了私有 API 黑名单安全设置。

任何帮助将不胜感激。与此相关的唯一其他威胁就在这里,但从未解决:

Android Q VirtualDisplay touch input events

【问题讨论】:

  • 我不小心链接了 JNI 类。这是 Java 类:android.googlesource.com/platform/frameworks/base/+/refs/heads/…
  • 我正在尝试实现非常相似的目标,但在虚拟监视器上启动外部应用程序时遇到了困难。我收到一个权限错误,似乎我的应用程序必须具有系统级权限才能获得它。您能解释一下您是如何做到这一点的吗?
  • 我从来没有遇到过这样的错误。在我的 GitHub 上查看 ExtLaunch,它显示了我是如何做到的(用户名 tytydraco)。我只是传递带有意图 iirc 的显示 ID。
  • 我检查过了。似乎只有当您尝试在“OWN”虚拟显示器中启动外部应用程序时才会出现权限问题,这些应用程序是通过 DisplayManager.createVirtualDisplay() 创建的。在 Launcher.kt 中,您无需创建虚拟显示器,而是使用现有的。您所指的虚拟显示器可能是根据开发人员设置“模拟辅助显示器”创建的。所以,这就解决了!顺便说一句,我检查了您的 Google Play 帐户。酷的东西!感谢您支持开源,并回答我的问题:)

标签: android android-10.0 android-virtualdisplay


【解决方案1】:

我已经解决了我的问题。指向外部显示器的输入由 Android 内部框架控制。默认情况下,外部鼠标指向内部显示器。要让他们转到外部显示器,必须在开发人员设置中启用强制桌面模式。目前没有其他方法可以转发指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多