使用辅助功能服务修改另一个应用程序的视图层次结构

5
众所周知,我们可以使用AccessibilityService观察或查询任何应用的视图层次结构: 创建自己的辅助功能服务
还可以代表用户执行操作: 为Android开发辅助功能服务
我的问题是,我们能否使用AccessibilityService修改前台应用程序的视图层次结构?

enter image description here

我已经参考了以下问题:

他们正在使用WindowManagerSYSTEM_ALERT_WINDOW权限,在前台应用程序上覆盖一个视图。这种方法的问题是,如果用户按下BACKHOME,则应用程序被解除,但视图仍然可见于屏幕上,即使应用程序已经消失。该视图位于视图层次结构的顶部,而不是其一部分。

  • 是否有一种方法可以添加/修改AccessibilityNodeInfo对象?
  • 它们与ViewViewGroup相同吗?
  • 我们是否允许使用AccessibilityService添加视图或修改现有视图?
我的要求是在应用程序中显示一个小视图。它必须成为应用程序视图层次结构的一部分,以便它随着应用程序的存在或离开而变化。为此,我需要修改应用程序的视图层次结构,即从服务检索到的AccessibilityNodeInfo对象。我想要的是类似于addView()的东西,但是将View添加到应用程序本身的视图层次结构中,而不是在其上方。我们怎么做?这可能吗?更新:支持自定义辅助功能视图的应用程序。

当你想要绘制的应用程序离开前台时,你不能隐藏覆盖层吗? - ataulm
3个回答

1

您仍然可以采用在应用程序上绘制的方法,而不是作为其视图层次结构的一部分(这是不可能的)- 使用SYSTEM_ALERT_WINDOW权限。

为了知道何时关闭应用程序并关闭自己的覆盖层 - 监听辅助功能事件TYPE_WINDOW_STATE_CHANGED并检查是否有软件包更改。

您还可以进一步监听TYPE_WINDOW_CONTENT_CHANGED并确定是否有某些布局更新。 更多的辅助功能事件可能会很方便或微调您的覆盖层的准确性。

简而言之-只要您具有有关底层应用程序布局和事情发生的适当信息,就可以像它是应用程序的一部分一样在其上面绘制。 可能有些棘手,需要进行一些计算,因为您无法将视图推入层次结构中,但完全可行。


感谢您的反馈。我已经在使用SYSTEM_ALERT_WINDOW 权限并显示了一个覆盖层。将尝试使用您建议的方法来满足我的需求,并回复您... :) - Yash Sampat

1

不,你不能修改另一个应用程序的视图层次结构,因为它存在于单独的进程中。

这类似于无法从辅助功能服务内部修改辅助功能节点。


1

1) 你可以利用“绘制在其他应用程序上方”的权限。该解决方案仅允许您在其他应用程序上绘制覆盖物,而不会更改其他应用程序的行为。

2) 您可以利用测试机制。如果您拥有足够的应用程序信息(应用程序 ID、活动名称)和足够的特权(从应用程序内运行测试工具并等待结果),或者具有 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)
    }
}

感谢您抽出时间回答。第一个我知道,但第二个对我来说是新的。这真的可行吗?据我所知,第二种方法需要签名级别的权限,我们可能没有这个权限。 - Yash Sampat
另外,第一种方法存在的问题(顺便说一下,我已经在使用了)是它不在应用程序的视图层次结构中。当前台视图更改、用户导航到其他地方或应用程序被关闭时,这会导致问题。 - Yash Sampat
没有足够的权限,不能使用第二种解决方案。您是否拥有root访问权限或其他访问另一个应用程序文件的可能性?也许可以直接将逻辑注入存储中的dex文件中? - Link182

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接