【发布时间】:2015-05-12 11:39:08
【问题描述】:
我有一个Service,它可以使用包含自定义View 的SYSTEM_ALERT_WINDOW 在所有应用程序之上绘制Canvas。
我的Service 和自定义View 都实现了View.OnTouchListener
Service的onTouch(View v, MotionEvent ev){}方法返回true,而自定义View返回false。这使我可以在所有应用程序之上显示我的自定义View,并且仍然与底层Activity 交互。这部分有效。
我还希望Service 在当前Activity(位于SYSTEM_ALERT_WINDOW 下方)的指定坐标中模拟触摸事件。
我希望我可以在自定义视图上调用View.dispatchTouchEvent(...),因为onTouch(...) 返回false,触摸事件将被传递到底层Activity。它不起作用。
在这种情况下如何在任何 Activity 中模拟触摸事件?
我使用了以下来源的代码...
在所有应用程序之上绘制一个画布:
http://www.piwai.info/chatheads-basics/
Draw an Android canvas on top of all applications?
将触摸传递给底层应用:
How can I interact with elements behind a translucent Android app?
模拟触摸:
【问题讨论】:
-
AFAIK,出于明显的安全原因,您不能,除非可能是在根设备上。甚至可访问性 API 也不支持此 AFAICT。允许任意应用向其他应用伪造输入将是一个主要的安全漏洞。
-
如果专门访问视图,是否至少可以在属于 Android 操作系统的应用程序中模拟触摸输入?我可以做类似 getView().dispatchTouchEvent(..) 的事情吗?
-
"我可以做类似 getView().dispatchTouchEvent(..) 的事情吗?" -- 不,因为
View在另一个进程中,不是你的。 -
是否有另一种方法可以自动与视图交互?
-
您可以使用可访问性 API 为您提供的任何内容。您可能可以在有根设备上做更多的事情,但我什至不知道在这种情况下该在哪里为您指明该怎么做。
标签: android touch android-5.0-lollipop