众所周知,我们可以使用 AccessibilityService
观察或查询任何应用程序的 View 层次结构:
Create your own accessibility service
。
也可以代表用户执行 操作:
Developing an Accessibility Service for Android
。
我的问题是,我们可以 使用 AccessibilityService
修改 前台应用程序的 View 层次结构吗?
我已经提到了以下问题:
他们正在做的是使用
WindowManager
和 SYSTEM_ALERT_WINDOW
权限在前台的应用程序顶部叠加一个 View 。这种方法的问题在于,如果用户按下 BACK 或 HOME ,应用程序将被关闭,但即使在应用程序消失后, View 仍然在屏幕上可见。该 View 位于 View 层次结构的 TOP 上,而不是它的一部分。AccessibilityNodeInfo
对象? View
或 ViewGroup
相同? 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/