Android辅助功能 Accessibility Services基本用法笔记
概述
Accessbility 又叫做辅助功能,是Android官方推出帮助身体不便或者操作不灵活的人来辅助操作手机应用的。当然也可以用来干一些别的事,比如自动抢红包啊,静默安装app,帮助用于开一系列权限操作等。出于项目需求,大概研究了下Accessilibity的基本用法。
Accessibility用法
实现自己的辅助功能类
要实现自己的辅助功能,需要继承系统的AccessibilityService服务类。然后实现其中的抽象方法,这些方法被系统调用的顺序是:当辅助功能服务开始时onServiceConnected()方法会被调用,当辅助功能正在运行时onAccessibilityEvent(), onInterrupt()方法会被调用,当辅助功能结束时onUnbind()方法会被调用。以上也就是辅助功能的生命周期了。
- onServiceConnected() (可选的方法)系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置工作。
- onAccessibilityEvent() - (必须实现的方法) 通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。在整个生命周期里会被调用多次
- onInterrupt() - (required) 这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。
- onUnbind() - (optional) 在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。
Manifest 注册和权限申明
想要实现自己的辅助功能,你需要在Manifest配置文件中注册该服务,且申明相应的权限。如此,你才能接收到系统的服务功能服务。
Accessibility service 的申明
为了实现辅助功能,你需要在Manifest中添加如下代码:
<application><service android:name=".MyAccessibilityService"android:label="@string/accessibility_service_label"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter></service>
</application>
注意 1. action 是固定的“android.accessibilityservice.AccessibilityService”用于系统启动我们的辅助功能
注意2. 你必须给你的辅助功能服务申请权限 android:permission=”android.permission.BIND_ACCESSIBILITY_SERVICE”,否者不能使用辅助功能。
Accessibility service 配置
辅助功能必须指定一个辅助事件配置文件来处理和过滤指定的事件。辅助功能配置可以由AccessibilityServiceInfo来实现,在辅助功能服务的onServiceConnected()方法中调用AccessibilityServiceInfo类的setServiceInfo()方法来配置。
当然从Android 4.0开始,你也可以在manifest中添加 标签来未辅助功能指定一个xml的配置。代码如下:
<service android:name=".MyAccessibilityService">...<meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_service_config" />
</service>
标签指向一个XML资源文件,文件路径(/res/xml/accessibility_service_config.xml). 示例代码如下:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/accessibility_service_description"android:packageNames="com.example.android.apis"android:accessibilityEventTypes="typeAllMask"android:accessibilityFlags="flagDefault"android:accessibilityFeedbackType="feedbackSpoken"android:notificationTimeout="100"android:canRetrieveWindowContent="true"
/>
如上配置可以指定该辅助功能监听哪个应用的操作,允许处理哪些事件,用户点击事件反馈的类型,查找节点方式,超时时间,是否允许辅助功能获得窗口节点信息等。配置文件属性解释如下:
- android:description :辅助功能描述,描述该辅助功能用来干嘛的
- android:packageNames :指定辅助功能监听的包名,不指定表示监听所有应用
- android:accessibilityEventTypes:辅助功能处理事件类型,一般配置为typeAllMask表示接收所有事件
- android:accessibilityFlags:辅助功能查找截点方式,一般配置为flagDefault默认方式。
- android:accessibilityFeedbackType:操作相应按钮以后辅助功能给用户的反馈类型,包括声音,震动等。
- android:notificationTimeout:相应时间设置
- android:canRetrieveWindowContent:是否允许辅助功能获得窗口的节点信息,为了能正常实用辅助功能,请务必保持该项配置为true
从一个AccessibilityEvent中调查完全视图层级的能力隐式地暴露私有用户信息给你的无障碍服务。出于这个原因,你的服务必须通过无障碍服务配置XML文件请求这个级别的访问权,通过包含canRetrieveWindowContent属性和设置它为true。如果你不在你的服务配置xml文件中包含这个设置,那么对getSource()的调用会失败。
想要了解更多更详细的配置,请阅读AccessibilityServiceInfo类。该类就是用于辅助功能服务配置信息类。
开启辅助功能开关
如下代码判断辅助功能是否开启,如果没有开启,则跳转到系统页面去开启。
/*** 该辅助功能开关是否打开了* @param accessibilityServiceName:指定辅助服务名字* @param context:上下文* @return*/private boolean isAccessibilitySettingsOn(String accessibilityServiceName, Context context) {int accessibilityEnable = 0;String serviceName = context.getPackageName() + "/" +accessibilityServiceName; try {accessibilityEnable = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, 0);} catch (Exception e) {Log.e(TAG, "get accessibility enable failed, the err:" + e.getMessage());}if (accessibilityEnable == 1) {TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');String settingValue = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);if (settingValue != null) {mStringColonSplitter.setString(settingValue);while (mStringColonSplitter.hasNext()) {String accessibilityService = mStringColonSplitter.next();if (accessibilityService.equalsIgnoreCase(serviceName)) {Log.v(TAG, "We've found the correct setting - accessibility is switched on!");return true;}}}}else {Log.d(TAG,"Accessibility service disable");}return false;}/*** 跳转到系统设置页面开启辅助功能* @param accessibilityServiceName:指定辅助服务名字* @param context:上下文*/private void openAccessibility(String accessibilityServiceName, Context context){if (!isAccessibilitySettingsOn(accessibilityServiceName,context)) {Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);startActivity(intent);}}
使用辅助功能查找节点
首先我们可以通过如下方法获取当前页面节点信息AccessibilityNodeInfo:
- AccessibilityEvent#getSource :得到AccessibilityNodeInfo事件来源
- AccessibilityService#getRootInActiveWindow :得到当前窗口根节点所有信息
以上两个方法都可以获取到当前页面的节点信息,然后我们可以通过AccessibilityNodeInfo来查找具体的View,然后对该View操作。查找View有两如下两种方法:
- AccessibilityNodeInfo#findAccessibilityNodeInfosByText():通过Text查找
- AccessibilityNodeInfo#findAccessibilityNodeInfosByViewId():通过Id查找
我们一般都通过指定的Text内容来查找,这样查找方便,简单
使用辅助功能模拟点击
我们通过AccessibilityNodeInfo#findAccessibilityNodeInfosByText()查找到指定的node节点后,就可以通过相应的方法模拟点击事件了。方法如下:
- AccessibilityNodeInfo#performAction() :执行用户行为操作
比如点击事件代码如下:
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
用户常用的行为事件类型一般有如下:
- ACTION_CLICK:模拟点击
- ACTION_SELECT:模拟选中
- ACTION_LONG_CLICK:模拟长按
- ACTION_SCROLL_FORWARD:模拟往前滚动
总结:
虽然很多手机支持辅助功能,但是由于各手机厂商定制或者自定义View,没有严格按照Google标准来,使得有些界面使用了自定义的View,导致辅助功能找不到其节点,从而使得即使有辅助功能,也不能模拟点击View操作。
Android辅助功能 Accessibility Services基本用法笔记相关推荐
- android 辅助功能_辅助功能简介
android 辅助功能 Accessibility may be more than a moral imperative to ensure products are inclusive of m ...
- Android辅助功能(Accessibility)简介
Android辅助功能(Accessibility)简介 Accessibility 由于部分安卓用户在身体的问题致使他们不能看完整的屏幕或者使用触屏,google提供了Accessibility功能 ...
- 如何使用好android的可访问性服务(Accessibility Services)
原文:http://android.eoe.cn/topic/android_sdk * 主题* Manifest声明和权限 可访问性服务声明 可访问性服务配置 AccessibilityServic ...
- android服务绑定异步,Android中异步类AsyncTask用法总结
本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...
- 使用Android辅助功能AccessibilityService实现微信自动聊天【外挂插件】
本文是使用Android辅助功能AccessibilityService实现微信自动聊天demo: 只是为了跟深入的了解Android辅助功能, 提高自身的动手能力. 请勿用于商用,或非法用途. 动手 ...
- Android TV TIF源码阅读笔记
Android TV TIF源码阅读笔记 1.SystemSever.java if (mPackageManager.hasSystem ...
- Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)
Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...
- 湖南某科技大学 安卓Android移动开发基础期中考试笔记(持续更新)
湖南某科技大学 安卓Android移动开发基础期中考试笔记 前言 建议大家把第三章的三个实战演练和本笔记的所有代码部分都在AS中手打一遍,手打的意思是看懂之后自己写出来,而不是照着抄.这不90分就到手 ...
- Android Jetpack Components of LiveData 学习笔记
Android Jetpack Components of Lifecycle 学习笔记 Android Jetpack Components of LiveData 学习笔记 Android Jet ...
最新文章
- django 快速实现完整登录系统(cookie)
- spring cloud 自定义配置源及配置刷新
- 全球及中国医养结合产业发展战略建议与投资价值评估报告2022版
- 学多少返多少 | 人工智能核心课零门槛就业涨薪培养计划
- linux安装mysql的分支mariadb
- python统计分析---6.主成分分析
- 【Linux】Linux的关机和虚拟机克隆、快照
- JZOJ 1286. 太空电梯
- JavaScript 获取当前时间戳的三种方式
- hadoop2.7.1安装初上手
- 绘图的尺寸_【科研绘图1】你离顶级期刊封面仅差一步
- java中的定时任务
- 金博宝芝灵K6医药管理软件吉度盘点机PDA盘点
- c语言setw,C++ iomanip setw()用法及代码示例
- 阿里云服务器能怎么玩呢?
- linux office转换pdf
- 雷顿学院大数据(一期课程)
- 泛泛而谈的渲染学习记录(二)—— 高斯模糊卷积的线性分解理解
- 生动的SDN基础内容介绍(六)--SDN应用平面和网络测量
- Spark REPL