=>获取任何应用程式上的萤幕轻击/点击.
=>获取被点击/点击的视图.
最初我认为这是不可能的,因为安全的原因,但在做一些研究,我碰到一个应用程序(Native clipboard),可以做以下事情:
=>检测来自任何应用程序的EditTexts上的水龙头
=>将值(字符串)添加到这些EditTexts.
我也看到了Google’s talkback,无论你点击什么.为了说话,它需要访问应用程序的视图(获取文本).
这些应用程序显然利用“辅助服务”来实现,但是我想知道如何实现?
我主要找到我需要实现的教程或东西,但我正在努力寻找一些为我的应用程序实现辅助功能服务.我没有访问Android官方文档,这对于像我这样的新手来说太技术了. (我最初喜欢从Youtube,SO和教程网站学习).如果您可以指出我参考其他涵盖这些内容的教程,这也是很棒的.
解决方法
下面是onAccessibilityEvent回调.这是您将聆听不同类型的活动的地方,也是大多数情况下抓取屏幕内容的最方便的地方.虽然,作为无障碍服务,您也不必等待事件.您可以轻松地产生一个AsynTask,并以某种间隔抓住它.
public void onAccessibilityEvent(AccessibilityEvent event) { CLog.d(event.toString()); switch (event.getEventType()) { //On Gesture events print out the entire view heirarchy! case AccessibilityEvent.TYPE_GESTURE_DETECTION_START: CLog.d(A11yNodeInfo.wrap(getRootInActiveWindow()).toViewHeirarchy()); case AccessibilityEvent.TYPE_VIEW_CLICKED: CLog.d(event.getSource().toString()); default: { //The event has different types,for you,you want to look for "action clicked" if (event.getSource() != null) { CLog.d(A11yNodeInfo.wrap(event.getSource()).toViewHeirarchy()); } } } }
我会指出一点配置,因为它是非常重要的.辅助功能服务通过通过清单文件连接到您的服务的XML文件进行配置.该文件的内容是:
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/accessibility_service_description" android:accessibilityEventTypes="typeAllMask" android:accessibilityFlags="flagReportViewIds" android:canRetrieveWindowContent="true" android:canRequestTouchExplorationMode="true" android:accessibilityFeedbackType="FeedbackSpoken" android:notificationTimeout="100" android:settingsActivity="com.moba11y.basicaccessibilityservice.SettingsActivity" />
对于你,重要的位是canRetrieveWindowContent =“true”和“accessibilityEventTypes =”typeAllMask“’.我喜欢的设计是确保您抓住所需的最小事件类型.不同的可访问性事件报告大致不同的结果.例如,许多事件从getSource()返回“null”.这迫使您为此添加了大量过滤器,或冒险空指针异常.这很讨厌
您需要的最后一点是辅助功能操作.这可以让您模拟点击次数,长时间的点击次数,并将文本添加到可编辑的文本视图中.以下是允许您执行此操作的代码.
public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if (source != null & event.getClassName().equals("android.widget.EditText")) { Bundle arguments = new Bundle(); arguments.putCharSequence(AccessibilityNodeInfo .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"some value"); source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,arguments); } }
https://github.com/chriscm2006/Android-Accessibility-Service-Boilerplate