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

Android 使用辅助功能服务修改另一个应用程序的视图层次结构,android,android-view,android-windowmanager,android-accessibility,android-viewgroup,Android,Android View,Android Windowmanager,Android Accessibility,Android Viewgroup,众所周知,我们可以观察或查询具有AccessibilityService的任何应用程序的视图层次结构: 也可以代表用户执行操作: 我的问题是,我们能否使用可访问性服务修改前台应用程序的视图层次结构 我已提出下列问题: 他们所做的是使用WindowManager和SYSTEM\u ALERT\u WINDOW权限在前台应用程序顶部覆盖视图。这种方法的问题是,如果用户按后退或主页,应用程序将被关闭,但即使在应用程序消失后,视图仍会显示在屏幕上。视图位于视图层次结构的顶部,而不是其一部分

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

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

我的问题是,我们能否使用
可访问性服务
修改前台应用程序的视图层次结构

我已提出下列问题:

他们所做的是使用
WindowManager
SYSTEM\u ALERT\u WINDOW
权限在前台应用程序顶部覆盖视图。这种方法的问题是,如果用户按后退主页,应用程序将被关闭,但即使在应用程序消失后,视图仍会显示在屏幕上。视图位于视图层次结构的顶部,而不是其一部分

  • 是否有方法添加/修改
    AccessibilityNodeInfo
    对象
  • 它们是否与
    视图
    视图组
    相同
  • 是否允许我们使用
    可访问性服务
    添加视图或修改现有视图
我的要求是在应用程序本身中显示一个小视图。 它必须是应用程序视图层次结构的一部分,这样它才能保持不变 或者与应用程序一起使用。为此,我需要修改的视图层次结构 应用程序,即从 服务

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

我们怎样才能做到这一点?这可能吗

更新


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

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

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

2) 您可以利用检测测试机制。如果您有足够的应用程序信息(应用程序id、活动名称)和足够的权限(),或根权限。以下是一个例子:

@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)
    }
}
@RunWith(AndroidJUnit4::class)
类注入视图{
@获取:规则
val activityRule=ActivityTestRule(MainActivity::class.java)
@试验
视图(){
val rootLayout=activityRule.activity.findviewbyd(android.R.id.content)
activityRule.runOnUiThread{
rootLayout.addView(TextView(activityRule.activity).apply{
text=“注入视图”
})
}
线程。睡眠(10_000)
}
}

您仍然可以使用在应用程序顶部绘制的方法,而不是作为其视图层次结构的一部分(这是不可能的)-使用
SYSTEM\u ALERT\u WINDOW
权限

为了知道应用程序何时被关闭并关闭您自己的覆盖,请收听可访问性事件
键入\u WINDOW\u STATE\u CHANGED
,并检查软件包是否有更改

您还可以进一步收听
类型\u窗口\u内容\u更改
,并确定有一些布局更新。 更多可访问性事件可能会派上用场,或者微调覆盖的准确性

简言之,只要你有适当的信息来了解底层应用程序的布局,并且当事情发生时,你可以在上面画图,就好像它是应用程序的一部分一样。
这可能很棘手,需要进行一些计算,因为您无法将视图推入层次结构,但完全可行。

当您要绘制的应用程序离开前景时,您不能隐藏覆盖吗?感谢您花时间回答。第一个我知道,但是第二个对我来说是新的。这真的可行吗?据我所知,第二种方法需要签名级权限,而我们可能没有。此外,第一种方法(我已经在使用btw)的问题是,它不在应用程序的视图层次结构中。当前景视图更改、用户导航到其他位置或应用程序被关闭时,这会产生问题。如果没有足够的权限,则无法使用第二个解决方案。您是否具有root访问权限或任何其他访问其他应用程序文件的可能性?也许可以将逻辑直接从存储中注入到dex文件中?谢谢您的反馈。我已经在使用SYSTEM\u ALERT\u窗口权限并显示覆盖。将尝试使用您建议的方法来满足我的要求,并回复您……:)