无障碍这个功能已经出来很久了,不过到现在我都没看见什么无障碍教程,成品应用也只看见过扣字助手和扛把子的红包助手,所以今天我写个无障碍的简单使用教程,希望大家支持
注:本为转载文章,原作者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.)
然后把手册里的这段代码粘贴到这来,打包,安装,到系统设置里开启无障碍,然后打开贴吧极速版看效果吧
让我们解析一下每一行代码:
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,就像你拧水龙头放水,放完了之后必须关上。
现在我们来实现下一个功能,自动跳转到某个吧
首先看看跳转吧页面的界面名
然后找到输入框的id,R.id.home_et_search
然后我们修改官方教程,得到代码:
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", "残页同学")
//输入内容“残页同学”
然后我们需要点击这个「前往」按钮,怎么点呢?当然可以根据id点击,不过这里我们换一种新方法,通过文字找到对应的节点点击
修改官方教程可得代码:
java(null, ays, "com.iapp.app.ays.cktext", "AccessibilityNodeInfo", node, "int", 16, "String", "前往")
//点击「前往」按钮
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包名为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手册以及群文件中,欢迎前来下载!
转载声明
原作者:贴吧@残页技术
整理+转载:晓空