【无障碍】无障碍简单使用教程

无障碍这个功能已经出来很久了,不过到现在我都没看见什么无障碍教程,成品应用也只看见过扣字助手和扛把子的红包助手,所以今天我写个无障碍的简单使用教程,希望大家支持

注:本为转载文章,原作者by 残页

工具:

开发者助手(酷安可以找到)
mt管理器
iApp
支持无障碍的手机一台
一颗勇敢的心


首先我们需要确定自己要监听的是什么应用,比如这里我测试的是贴吧极速版7.0.0.0,包名是com.baidu.tieba

打开iapp,创建一个模块名为ays_service,输入这些:

//初始化事件方法 onsc 启动时回调一次
fn onsc()
s pns = "你要监听的包名"
javass(a, null, "com.iapp.app.ays.pns", pns)
javass(a, null, "com.iapp.app.ays.nt", 1000)
end fn 

然后你需要创建一个函数on:

//事件方法 on 实时回调变化事件
fn on(e)
end fn

这个函数会在被监听的应用发生活动时回调

比如我们需要监听的是贴吧极速版,包名是com.baidu.tieba_mini,需要实现的功能是当贴吧在主界面时,点击搜索框,这个时候我们就需要开发者助手了

利用开发者助手,你可以看见贴吧极速版的主界面名com.baidu.tieba.tblauncher.MainTabActivity

【无障碍】无障碍简单使用教程插图

然后通过修改iapp的示例,我们得到了这段代码:

java(node, ays, "com.iapp.app.ays.gall", "AccessibilityEvent", e)
//判断事件来源是不是贴吧
java(gpn, ays, "com.iapp.app.ays.gpn", "AccessibilityEvent", e)
f(gpn == "com.baidu.tieba_mini") {
java(gcn, ays, "com.iapp.app.ays.gcn", "AccessibilityEvent", e)
f(gcn == "com.baidu.tieba.tblauncher.MainTabActivity") {
//贴吧极速版主界面
java(nodeList, ays, "com.iapp.app.ays.id", "AccessibilityNodeInfo", node, "String", "com.baidu.tieba_mini:id/search_root")
java(null, ays, "com.iapp.app.ays.ck", "java.util.List", nodeList, "int", 16)
//点击搜索框
}
}
java(b, ays, "com.iapp.app.ays.re", "AccessibilityNodeInfo", node)
//使用完了以后释放node

id的格式为包名:/开发者助手获取到的id名(去掉R.id.)

然后把手册里的这段代码粘贴到这来,打包,安装,到系统设置里开启无障碍,然后打开贴吧极速版看效果吧

【无障碍】无障碍简单使用教程插图(1)
【无障碍】无障碍简单使用教程插图(2)
【无障碍】无障碍简单使用教程插图(3)
【无障碍】无障碍简单使用教程插图(4)

让我们解析一下每一行代码:
java(node, ays, "com.iapp.app.ays.gall", "AccessibilityEvent", e)
这行是获取对应的根节点,通过这个节点可以进行一系列操作
java(gpn, ays, "com.iapp.app.ays.gpn", "AccessibilityEvent", e)
获取事件源包名,可以判断出这个事件是由哪个应用发出的
java(gcn, ays, "com.iapp.app.ays.gcn", "AccessibilityEvent", e)
获取事件源的类名,比如如果是与界面有关的就是这个界面的类名

java(nodeList, ays, "com.iapp.app.ays.id", "AccessibilityNodeInfo", node, "String", "com.baidu.tieba_mini:id/search_root")
这行代码是根据id获取对应的节点,需要注意的是返回的是一个数据列表,因为可能同时存在多个符合要求的节点
如果失败的话试试用数字id
java(null, ays, "com.iapp.app.ays.ck", "java.util.List", nodeList, "int", 16)
点击给出的所有节点,16表示单击,其他事件对应的数字代码可以在帮助里找到
帮助里还提供了一个快速的点击对应id的节点的方法
也就是说点击可以这样写
java(null, ays, "com.iapp.app.ays.ckid", "AccessibilityNodeInfo", node, "int", 16, "String", "com.baidu.tieba_mini:id/search_root")

java(b, ays, "com.iapp.app.ays.re", "AccessibilityNodeInfo", node)
这段代码需要加在最后,用来释放掉这个node,就像你拧水龙头放水,放完了之后必须关上。

现在我们来实现下一个功能,自动跳转到某个吧
首先看看跳转吧页面的界面名

【无障碍】无障碍简单使用教程插图(5)

然后找到输入框的id,R.id.home_et_search

【无障碍】无障碍简单使用教程插图(6)

然后我们修改官方教程,得到代码:
java(nodeList, ays, "com.iapp.app.ays.id", "AccessibilityNodeInfo", node, "String", "com.baidu.tieba_mini:id/home_et_search")
//找到真正的搜索框的节点
java(null, ays, "com.iapp.app.ays.enter", "java.util.List", nodeList, "String", "残页同学")
//输入内容“残页同学”

【无障碍】无障碍简单使用教程插图(7)

然后我们需要点击这个「前往」按钮,怎么点呢?当然可以根据id点击,不过这里我们换一种新方法,通过文字找到对应的节点点击
修改官方教程可得代码:
java(null, ays, "com.iapp.app.ays.cktext", "AccessibilityNodeInfo", node, "int", 16, "String", "前往")
//点击「前往」按钮

【无障碍】无障碍简单使用教程插图(8)
on函数完整代码: 
java(node, ays, "com.iapp.app.ays.gall", "AccessibilityEvent", e)
//判断事件来源是不是贴吧
java(gpn, ays, "com.iapp.app.ays.gpn", "AccessibilityEvent", e)
f(gpn == "com.baidu.tieba_mini") {
java(gcn, ays, "com.iapp.app.ays.gcn", "AccessibilityEvent", e)
f(gcn == "com.baidu.tieba.tblauncher.MainTabActivity") {
//贴吧极速版主界面
java(null, ays, "com.iapp.app.ays.ckid", "AccessibilityNodeInfo", node, "int", 16, "String", "com.baidu.tieba_mini:id/search_root")
//点击搜索框
} else f(gcn == "com.baidu.tieba.mainentrance.SquareSearchActivity") {
//搜索界面
java(nodeList, ays, "com.iapp.app.ays.id", "AccessibilityNodeInfo", node, "String", "com.baidu.tieba_mini:id/home_et_search")
//找到真正的搜索框的节点
java(null, ays, "com.iapp.app.ays.enter", "java.util.List", nodeList, "String", "残页同学")
//输入内容“残页同学”
java(null, ays, "com.iapp.app.ays.cktext", "AccessibilityNodeInfo", node, "int", 16, "String", "前往")
//点击「前往」按钮
}
}
java(b, ays, "com.iapp.app.ays.re", "AccessibilityNodeInfo", node)
//使用完了以后释放node

然后你就可以打包看效果了(滑稽)


我们来实现一个新功能:当qq进入聊天界面时,自动发送消息
通过上面介绍的方法,可以得到qq包名为com.tencent.mobileqq
消息输入框id为com.tencent.mobileqq:id/input
发送按钮id为com.tencent.mobileqq:id/fun_btn

我们可以得到这段代码

f(gpn == "com.tencent.mobileqq") {
//来自QQ
//我们不判断是否在聊天界面,原因很简单,iapp抽风了……
//我们直接进行操作,如果不在聊天界面最多操作失败
java(nodeList, ays, "com.iapp.app.ays.id", "AccessibilityNodeInfo", node, "String", "com.tencent.mobileqq:id/input")
//输入框
java(null, ays, "com.iapp.app.ays.enter", "java.util.List", nodeList, "String", "iapp无障碍自动发送消息测试")
//输入内容
java(null, ays, "com.iapp.app.ays.ckid", "AccessibilityNodeInfo", node, "int", 16, "String", "com.tencent.mobileqq:id/fun_btn")
//点击发送按钮,不使用文字找节点点击是因为可能点到其他地方
//比如如果收到了一条消息的内容就是「发送」,就会点到这条消息
} 

DEMO

链接: http://pan.baidu.com/s/18v-qZ6S8AKBzOvMJqvubDw 提取码: kifm

注:本源码已经收录至晓空iApp手册以及群文件中,欢迎前来下载!


转载声明

原作者:贴吧@残页技术 

整理+转载:晓空

原文地址 https://tieba.baidu.com/p/6223731404?

点赞
  1. 晓空 KJZH001说道:
    QQbrowser Windows 7

    :huaji:

发表评论

电子邮件地址不会被公开。必填项已用 * 标注