业余时间了解了Android无障碍服务的一些有趣功能,比如微信自动抢红包、应用宝的一键安装功能等。大致原理是监听手机窗体内容变化,拿到对应的View,进行点击、长按等Touch操作,下面我们就借助 AccessibilityService 这个服务类实现模拟点击功能。


效果

一、创建 MyAccessibilityService

1、继承AccessibilityService,重写 onAccessibilityEvent

class MyAccessibilityService : AccessibilityService() {override fun onAccessibilityEvent(event: AccessibilityEvent) {//获取指定包名应用val packageName = event.packageName//只使用界面变化的监听,避免点击事件监听进入死循环if(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED != event.eventType){return}if ("com.yufs.accessibility" == packageName) {LogUtils.e("Thread:${Thread.currentThread().name},event:${event}")//找到对应node,开始点击val nodeInfo = AsUtils.findNodeInfo(this,"com.yufs.accessibility:id/btn_click_node","节点模拟点击","")nodeInfo?.let {thread {LogUtils.e("找到节点,三秒后执行点击事件")Thread.sleep(3000)AsUtils.performClickNodeInfo(it)}}}}override fun onInterrupt() {LogUtils.e("onInterrupt==>")}/*** 服务连接成功*/override fun onServiceConnected() {super.onServiceConnected()thread {//便于设置完成后返回来看到显示效果Thread.sleep(5000)LogUtils.e("坐标点击:500,515")AsUtils.click(this, 507f, 512f)}}
}

onAccessibilityEvent 是最重要的方法,所有界面的操作事件都会回调此方法,不限于当前应用,可以监听手机上其他应用的界面。例如界面变化时,我们打印AccessibilityEvent的信息,可以看到基本的包信息、类名等

2、 注册服务

        <serviceandroid:name=".service.MyAccessibilityService"android:description="@string/description_in_xml"android:exported="true"android:enabled="true"android:label="@string/app_name"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_config" /></service>

3、服务的配置文件 accessibility_config.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:canPerformGestures="true"android:canRetrieveWindowContent="true"android:canRequestTouchExplorationMode="true"android:description="@string/description_in_xml"android:settingsActivity="com.yufs.accessibility.MainActivity"android:notificationTimeout="100" /><!--
accessibilityEventTypes:可以接收的事件类型,例如界面变化、点击等。typeAllMask 接收所有,根据实际情况选择合适的类型,减少电量的消耗
accessibilityFeedbackType:事件的反馈类型,暂时不知道用作啥
canPerformGestures:是否支持手势
canRetrieveWindowContent:是否允许读取窗口中的内容
canRequestTouchExplorationMode:在这种模式下,被触摸的项目会被大声说出,用户界面可以被激活通过手势探索
description:服务的描述文字
settingsActivity:开启服务界面显示一个设置按钮,可以返回应用指定界面
notificationTimeout:事件的发送间隔事件,单位毫秒
-->

二、实现点击

1、坐标点击:我们可以打开手机的指针位置,查看按钮的坐标

2、坐标点击代码

    /*** 坐标模拟点击:最低api24,即要求Android7.0以上*/fun click(accessibilityService: AccessibilityService, x: Float, y: Float) {val builder = GestureDescription.Builder()val path = Path()path.moveTo(x, y)path.lineTo(x, y)builder.addStroke(GestureDescription.StrokeDescription(path, 0, 1))val gesture = builder.build()accessibilityService.dispatchGesture(gesture,object : AccessibilityService.GestureResultCallback() {override fun onCancelled(gestureDescription: GestureDescription) {super.onCancelled(gestureDescription)}override fun onCompleted(gestureDescription: GestureDescription) {super.onCompleted(gestureDescription)}},null)}

3、根据id查找View

获取应用中view的id可以通过Android SDK中monitor.bat查看,双击运行

拿到resouce id 就可以查找view

/*** 查找节点信息** @param id* @param text* @param contentDescription* @return null表示未找到*/fun findNodeInfo(service: AccessibilityService,id: String,text: String,contentDescription: String): AccessibilityNodeInfo? {if (TextUtils.isEmpty(text) && TextUtils.isEmpty(contentDescription)) {return null}val nodeInfo = service.rootInActiveWindowif (nodeInfo != null) {val list = nodeInfo.findAccessibilityNodeInfosByViewId(id)for (n in list) {val nodeInfoText =if (TextUtils.isEmpty(n.text)) "" else n.text.toString()val nodeContentDescription =if (TextUtils.isEmpty(n.contentDescription)) "" else n.contentDescription.toString()if (TextUtils.isEmpty(text)) {if (contentDescription == nodeContentDescription) {return n}} else {if (text == nodeInfoText) {return n}}}}return null}

4、View节点点击

 /*** 点击节点* @return true表示点击成功*/fun performClickNodeInfo(nodeInfo: AccessibilityNodeInfo?): Boolean {if (nodeInfo != null) {if (nodeInfo.isClickable) {nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)return true} else {val parent = nodeInfo.parentif (parent != null) {val isParentClickSuccess = performClickNodeInfo(parent)parent.recycle()return isParentClickSuccess}}}return false}

三、源代码

代码下载

四、总结

通过学习无障碍服务可以实现很多重复性操作,方便用户解决更多的问题,

Android 无障碍服务自动点击相关推荐

  1. 利用无障碍服务自动获取微信号

    利用无障碍服务自动获取微信号 前言 基本思路 过程 AccessibilityService是什么? 如何创建一个AccessibilityService? 如何开启AccessibilityServ ...

  2. Android无障碍服务开发

    https://actionwind.wordpress.com/2022/04/17/android%e6%97%a0%e9%9a%9c%e7%a2%8d%e6%9c%8d%e5%8a%a1%e5% ...

  3. Android无障碍检测,Android无障碍服务检测通知

    我试图让我的应用在显示通知时进行检测.我已经在设置应用程序中启用它,并且onServiceConnected确实被调用,但是当我通过Gmail应用程序创建通知或接收电子邮件时,什么也没有发生,onAc ...

  4. Android黑科技 自动点击

    Android 模拟点击功能 使用adb命令 通过adb shell命令是下面的格式: adb shell input tap 520 1024 //点击(520,1024) adb shell in ...

  5. android无障碍服务网页,android无障碍

    安卓手机无障碍服务指的是什么 许多Android用户有不同的能力(限制),这要CSS布局HTML小编今天和大家分享他们以不同的方式使用他们的Android设备.这些限制包括视力,肢体或与年龄有关,这些 ...

  6. Android 无障碍服务设置

    项目中遇到需要将客户的无障碍服务设置为默认开启,无障碍服务,是可以监听界面的操作,比如:点击.拖动.界面更新等信息的,更为强大的是可以获取屏幕信息,同时具备普通Service的能力. 具体如何设置呢? ...

  7. Android无障碍服务( Accessibility Service)应用

    无障碍服务是一个应用程序,它给有残疾的用户或暂时无法与设备完全交互的用户提供了更好的无障碍用户交互功能.比如驾驶.照顾小孩或者在吵闹的派对上可能需要额外或者替代的交互反馈. Android提供了标准的 ...

  8. android怎样实现自动点击功能

    一个按钮之类的控件的自动点击的话,可以定时调用 button.performClick();

  9. android实现模拟自动点击_昆仑通态专题(十三):模拟实现全自动洗衣机系统的设计(案例)...

    点击上方蓝色字体,关注我们 01目的 学习使用MCGS嵌入版组态软件设计实现对全自动洗衣机系统的模拟控制.用触摸屏来控制西门子S7-200的PLC模拟工作.实训特点:使用触摸屏进行输入和  显示输出, ...

最新文章

  1. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
  2. 教程 | 理解和实现自然语言处理终极指南(附Python代码)
  3. 数据结构与算法常见笔试题 .
  4. 两数之和Python解法
  5. Java——网络编程练习
  6. 网络编程项目(聊天室项目)
  7. pyqt label上的图片旋转_python中tkinter入门之config、Scale、Canvas和导入图片
  8. Base64编码简介及在java中的使用
  9. 2018-1-2Linux基础知识(19)vi编辑器及bash算数
  10. vue之组件之间的传值
  11. dotnetNuke module development steps, dnn 模块开发步骤
  12. 手把手Java爬虫教学 - 1. 了解爬虫
  13. FW:一位软件工程师的6年总结
  14. 数学分析高等代数考研试题不断更新
  15. 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo”,在每个5的倍数行上打印“biz”;在每个7的倍数行上打印输出“baz”。
  16. 领导者都具备的四大思维能力
  17. play 项目 入到Idea
  18. 2017上半年计算机教学计划,2017上半年数学教学计划
  19. 2023年节假日数据放假补班数据json
  20. android+点击屏幕隐藏键盘,Android 显示和隐藏软键盘的方法(手动)

热门文章

  1. Oracle Partner Levels and Diamond Partners List
  2. 华颖平板电脑开机后显示android,平板M5停用系统应用的方法,让你平板快到飞起...
  3. 编程之美之数独求解器的C++实现方法
  4. Go 使用 buger/jsonparser 优化反序列化性能
  5. OPPO A96 参数配置
  6. HDU4417 主席树入门2
  7. 弹性碰撞后速度方向_高中物理竞赛典型例题精讲——垫圈弹性碰撞后速度方向...
  8. 【已解决】Win10 更新失败的问题【错误代码为0x80070003】
  9. PHP DES加密解密类
  10. 无处不在_电动汽车无处不在。 那丰田为什么还要继续投资氢呢?