Sru*_*rai 11 android accessibility accessibility-api accessibilityservice android-accessibility
我想在我的Android应用程序中实现一个辅助功能服务,它可以执行以下操作:
=>获取任何应用的屏幕点击/点击.
=>获取点击/点击的视图.
最初我认为由于安全原因这样做是不可能的,但在做一些研究时我遇到了一个应用程序(本机剪贴板),它可以执行以下操作:
=> EditText从任何应用程序检测s 上的点击
=>为那些EditTexts 添加值(字符串).
我还看到了谷歌的对讲,无论你点什么,它都会说话.要说它,它需要跨应用程序访问视图(获取文本).
这些应用程序显然使用"辅助功能服务"来实现,但我想知道如何实现它?
我主要为我需要实现的东西找到教程或内容,但我正在努力寻找一些实现我的应用程序的辅助功能服务.我确实访问了Android官方文档,这对于像我这样的新手来说太技术了.(我最初更喜欢向Youtube,SO和教程网站学习).如果你能指出我介绍其他一些涵盖这些内容的教程,那也很棒.
Chr*_*sCM 11
可访问性服务的文档记录很差,但我创建了一些辅助功能服务样板代码,用于设置启动项目并记录基本回调.我稍后会添加该链接,但是根据您的具体问题,我认为您需要关注的是一些代码.脚手架,项目设置等我离开回购.
下面是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());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将为此指出一点配置,因为它非常重要.辅助功能服务最好通过Manifest文件连接到您的服务的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"
/>
Run Code Online (Sandbox Code Playgroud)
对你来说重要的是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);
}
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/chriscm2006/Android-Accessibility-Service-Boilerplate
| 归档时间: |
|
| 查看次数: |
1737 次 |
| 最近记录: |