Android 无障碍服务自动点击

这篇具有很好参考价值的文章主要介绍了Android 无障碍服务自动点击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


效果

Android 无障碍服务自动点击

一、创建 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的信息,可以看到基本的包信息、类名等

 Android 无障碍服务自动点击

2、 注册服务

        <service
            android: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-data
                android: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、坐标点击:我们可以打开手机的指针位置,查看按钮的坐标

Android 无障碍服务自动点击

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查看,双击运行

Android 无障碍服务自动点击 

 Android 无障碍服务自动点击

 

 拿到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.rootInActiveWindow
        if (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.parent
                if (parent != null) {
                    val isParentClickSuccess = performClickNodeInfo(parent)
                    parent.recycle()
                    return isParentClickSuccess
                }
            }
        }
        return false
    }

 三、源代码

代码下载

四、总结

通过学习无障碍服务可以实现很多重复性操作,方便用户解决更多的问题,文章来源地址https://www.toymoban.com/news/detail-450805.html

到了这里,关于Android 无障碍服务自动点击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter flutter_accessibility_service无障碍服务

    flutter_accessibility_service a plugin for interacting with Accessibility Service in Android. Accessibility services are intended to assist users with disabilities in using Android devices and apps, or I can say to get android os events like keyboard key press events or notification received events etc. for more info check Accessibility Service Installation

    2024年02月10日
    浏览(49)
  • WorkTool无障碍服务实现企业微信机器人接口

    想要实现一个企业微信机器人,如京东/拼多多福利群、美团瑞幸定时营销群、自助订单查询、智能咨询或社群管理机器人等,首先官方未提供外部群/客户群的机器人API,会话存档也只在一定场景下适用,及时使用会话存档也存在只能收不能发的问题,有哪些办法可以合规的

    2024年02月14日
    浏览(51)
  • auto.js autojs pro9 autox.js实现adb自动化测试脚本开发自动生成代码 防无障碍检测

    不需要开无障碍就可以实现自动化 ,功能上和无障碍效果一样, 但是可以过目标app的检测,因为软件基本上都不检测adb(usb调试), 游戏脚本的福音 ,最主要是可以 直接生成自动化代码 ,所以写adb的自动化脚本 和无障碍的自动化脚本都同样简单高效,傻瓜式操作。 对于

    2024年01月19日
    浏览(59)
  • unidbg-补环境之无障碍模式

    2024年02月16日
    浏览(41)
  • [游戏开发]Unity颜色矫正无障碍方案

    之前有在关注色盲视觉纠正问题,最近在调整游戏的时候就打算把这个用上。 色弱色盲,这其实算是一种误称吧,只是人类中的少数派,只不过看到的颜色和大部分人不一样。下文用,视觉少数者,来称呼吧。 本质上是因为感知颜色的细胞发生突变,感知与大部分人有差异

    2024年02月15日
    浏览(40)
  • 手机APP-小米手机无障碍功能开启失败

    在设置中关闭以下三个设置: 不要设置为全面屏模式,不过可以在打开无障碍功能后再换回来。     ————————————————————— 以上就是今日博客的全部内容了 创作不易,若对您有帮助,可否点赞、关注一二呢, 感谢支持

    2024年02月08日
    浏览(87)
  • 为社会开发,无障碍开发,开发人员的公益时间

    无障碍开发是指开发人员在设计和开发软件时,考虑到残障人士的需求,以使他们能够享受到与其他人相同的体验。 无障碍开发是一种道德责任,也是一种商业机会,因为它可以为更广泛的人群提供无障碍产品和体验。 无障碍开发的重要性 无障碍开发可以使许多人受益,包

    2023年04月08日
    浏览(46)
  • 无障碍工具条在前端项目中的使用

    一、使用的工具 https://gitee.com/tywAmblyopia/ToolsUI 二、使用 VUE中使用 -1.拉取代码 -2.将 canyou 文件夹放到 public 目录下 -3.在 public 文件夹下的 index.html 文件中 /head标签前,引用v1.8以上的jquery.min.js(原网站已引用v1.8以上的jquery跳过此步骤)。 -4.在 public 文件夹下的 index.html 文件中 /he

    2024年02月14日
    浏览(51)
  • Facebook的可访问性使命:构建无障碍社交空间

    在当今数字时代,社交媒体不仅是人们交流、分享和连接的平台,更是构建开放、包容社交环境的关键。Facebook,作为全球最大的社交媒体平台之一,积极推动着可访问性使命,致力于构建一个无障碍的社交空间,使每个用户都能平等参与其中。本文将深入探讨Facebook在可访问

    2024年01月23日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包