众所周知,我们可以使用 AccessibilityService 观察或查询任何应用程序的 View 层次结构:

Create your own accessibility service

也可以代表用户执行 操作:

Developing an Accessibility Service for Android

我的问题是,我们可以 使用 AccessibilityService 修改 前台应用程序的 View 层次结构吗?

android - 使用无障碍服务修改另一个应用程序的 View 层次结构-LMLPHP

我已经提到了以下问题:

  • How do I add and remove a layout programmatically from an accessibility service?
  • Get view of AccessibilityNodeInfo to create overlay

  • 他们正在做的是使用 WindowManagerSYSTEM_ALERT_WINDOW 权限在前台的应用程序顶部叠加一个 View 。这种方法的问题在于,如果用户按下 BACK HOME ,应用程序将被关闭,但即使在应用程序消失后, View 仍然在屏幕上可见。该 View 位于 View 层次结构的 TOP 上,而不是它的一部分。
  • 有没有办法添加/修改 AccessibilityNodeInfo 对象?
  • 这些是否与 ViewViewGroup 相同?
  • 我们是否允许使用 AccessibilityService 添加 View 或修改现有 View ?



  • 我想要的是类似于 addView() 的东西,但是将 View 添加到应用程序本身的 View 层次结构中,而不是在它之上。

    我们应该怎么做?这可能吗?

    更新 :

    Apps that support Custom Views for Accessibility

    最佳答案

    1) 您可以利用 draw over other apps 权限。该解决方案将只允许您在其他应用程序上绘制叠加层,而不能更改其他应用程序的行为。

    2)您可以利用仪器测试机制。如果您有足够的关于应用程序的信息(应用程序 ID、 Activity 名称)和足够的权限( Run an instrument test from within app and wait for result )或 root 权限。下面是一个例子:

    @RunWith(AndroidJUnit4::class)
    class InjectView {
        @get:Rule
        val activityRule = ActivityTestRule<MainActivity>(MainActivity::class.java)
    
        @Test
        fun injectView() {
            val rootLayout = activityRule.activity.findViewById<ViewGroup>(android.R.id.content)
            activityRule.runOnUiThread {
                rootLayout.addView(TextView(activityRule.activity).apply {
                    text = "Injected View"
                })
            }
    
            Thread.sleep(10_000)
        }
    }
    

    关于android - 使用无障碍服务修改另一个应用程序的 View 层次结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59248779/

    10-11 22:15
    查看更多