全局快捷事件
# 说明
全局模块中封装的快捷事件,不用区分是无障碍模式还是代理模式
# 手势事件模式
## setGestureActionMode(mode)
设置各种手势模式事件的操作类型,默认是异步,目前只对无障碍模式有效
@param mode 1 代表异步,2代表同步
@param bool true代表成功 false代表失败
```js
function main(){
setGestureActionMode(1);
// setGestureActionMode(2);
}
main();
```
# 点击
## click(selectors)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
点击选择器
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = click(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
#### 进入抖音个人中心
```js
let selectors = text('我');
if(parseInt(device.getOSVersion()) >= 7) {
logd(click(selectors));
// clickable为true,可点击;为false,有的可点击,有的不可点击
} else if(parseInt(device.getOSVersion()) >= 5) {
if(selectors.clickable()) {
logd(clickEx(selectors));
// clickable必须为true,才可以执行clickEx
} else {
loge('组件不可点击');
}
} else {
loge('不支持5.0以下系统');
};
```
## clickEx(selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
无指针方式点击选择器,节点必须是可点击的才行
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = clickEx(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickRandom(selectors)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
随机点击选择器的任意元素
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = clickRandom(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickRandomEx(selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
随机点击选择器的任意元素
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = clickRandomEx(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickText(text)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
点击文本
@param text 文本
@return {boolean|布尔型}
```js
function main(){
var result = clickText("设置");
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickPoint(x,y)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
点击坐标
@param x x坐标
@param y y坐标
@return {boolean|布尔型}
```js
function main(){
var result = clickPoint(100,100);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
#### 抖音视频点赞
```js
// 模拟双击点赞
clickPoint(517,766);
sleep(200);
clickPoint(517,766);
```
## longClickEx(selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
无指针方式长点击选择器,节点必须是可点击的
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = longClickEx(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickRandomRect(rect)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
随机点击区域中的坐标
@param rect 区域对象
@return {boolean|布尔型}
```js
function main(){
var rect = new Rect();
rect.left = 10;
rect.right = 200;
rect.top = 10;
rect.bottom = 400;
var result = clickRandomRect(rect);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## clickCenter(rect)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
点击区域中的中心坐标
@param rect 区域对象
@return {boolean|布尔型}
```js
function main(){
var rect = new Rect();
rect.left = 10;
rect.right = 200;
rect.top = 10;
rect.bottom = 400;
var result = clickCenter(rect);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## longClick(selectors)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
长点击选择器
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = text("我是文本");
var result = longClick(selector);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
## longClickPoint(x,y)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
长点击坐标
@param x x坐标
@param y y坐标
@return {boolean|布尔型}
```js
function main(){
var result = longClickPoint(100,100);
if (result){
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
```
# 输入
## currentIsOurIme()
判断是否是自带输入法
@return {boolean|布尔型}
```js
function main(){
var result = currentIsOurIme();
if (result){
toast("是");
} else {
toast("否");
}
}
main();
```
## inputText(selectors,content)
> 执行条件:无障碍5.0以上
通过选择器输入数据,输入前会清空输入框数据
@param selectors 选择器
@param content 数据字符串
@return {boolean|布尔型}
```js
function main(){
var selectors= clz("android.widget.EditText");
var result = inputText(selectors,"我是内容");
if (result){
toast("是");
} else {
toast("否");
}
}
main();
```
## clearTextField(selectors)
> 执行条件:无障碍5.0以上
清除数据
@param selectors 节点选择器
@return {boolean|布尔型}
```js
function main(){
var selectors= clz("android.widget.EditText");
var result = clearTextField(selectors);
if (result){
toast("是");
} else {
toast("否");
}
}
main();
```
## imeInputText(selectors,content)
使用输入法输入内容,前提是已经设置本程序的输入法为默认输入法
输入前不会清空输入框数据
适合没有节点的情况,例如游戏等
@param selectors 选择器,可以为空,如果为空,前提是输入框是聚焦的状态
@param content 数据字符串
@return {boolean|布尔型}
```js
function main(){
var selectors= clz("android.widget.EditText");
var result = imeInputText(selectors,"我是内容");
if (result){
toast("是");
} else {
toast("否");
}
}
main();
```
## imeInputKeyCode(selectors,KEYCODE)
使用输入法输入内容,前提是已经设置本程序的输入法为默认输入法
输入前不会清空输入框数据
适合没有节点的情况,例如游戏等
@param selectors 选择器,可以为空,如果为空,前提是输入框是聚焦的状态
@param KEYCODE 具体请看 [KEYCODE列表](http://www.feiyunjs.com/2199.html)中KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
@return {boolean|布尔型}
```js
if(agentEvent.setCurrentIme()) {
var selector = clz("android.widget.EditText");
if (selector) {
logd(imeInputKeyCode(selector,66));
} else {
toast("无节点");
}
logd('恢复输入法:' + agentEvent.restoreIme());
} else {
loge('设置输入法失败');
}
```
#### 回车换行输入内容
```js
if(agentEvent.setCurrentIme()) {
var selector = clz("android.widget.EditText");
var node = selector.getOneNodeInfo(1000)
if (selector) {
node.imeInputText("学脚本那里去?")
imeInputKeyCode(selector,66)
sleep(200);
node.imeInputText("飞云编程学院")
imeInputKeyCode(selector,66)
sleep(200);
node.imeInputText("网址是多少?")
imeInputKeyCode(selector,66)
sleep(200);
node.imeInputText("www.feiyunjs.com")
} else {
toast("无节点");
}
logd('恢复输入法:' + agentEvent.restoreIme());
} else {
loge('设置输入法失败');
}
```
## pasteText(selectors,content)
> 执行条件:无障碍5.0以上
通过选择器粘贴数据
@param selectors 选择器
@param content 数据字符串
@return {boolean|布尔型}
```js
function main(){
var selectors= clz("android.widget.EditText");
var result = pasteText(selectors,"我是内容");
if (result){
toast("是");
} else {
toast("否");
}
}
main();
```
# 多点触摸
## multiTouch(action,x,y,pointer,delay)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
多点触摸
触摸参数:
- action :一般情况下 按下为0,弹起为1,移动为2
- x: X坐标
- y: Y坐标
- pointer:设置第几个手指触摸点,分别是 1,2,3等,代表第n个手指
- delay: 该动作延迟多少毫秒执行
@param touch1 第1个手指的触摸点数组,例如:
```js
[{"action":0,"x":1,"y":1,"pointer":1,"delay":20},{"action":2,"x":1,"y":1,"pointer":1,"delay":20}]
```
@param touch2 第2个手指的触摸点数组
@param touch3 第3个手指的触摸点数组
@param timeout 多点触摸执行的超时时间,单位是毫秒
@return boolean|布尔型
```js
function main() {
utils.openAppByName("视频");
sleep(3000);
//第一种数组式的写法
var touch1 = [
{"action": 0, "x": 500, "y": 1200, "pointer": 1, "delay": 1},
{
"action": 2,
"x": 500,
"y": 1100,
"pointer": 1,
"delay": 20
}, {
"action": 2,
"x": 500,
"y": 1000,
"pointer": 1,
"delay": 20
},
{
"action": 1,
"x": 1,
"y": 1,
"pointer": 1,
"delay": 20
}];
//第二种链式调用方法
var touch1 = MultiPoint
.get()
.action(0).x(500).y(1200).pointer(1).delay(1)
.next()
.action(2).x(500).y(1100).pointer(1).delay(1)
.next()
.action(2).x(500).y(1000).pointer(1).delay(1)
.next()
.action(2).x(500).y(900).pointer(1).delay(1)
.next()
.action(1).x(500).y(800).pointer(1).delay(1);
var touch2 = MultiPoint
.get()
.action(0).x(300).y(1200).pointer(2).delay(1)
.next()
.action(2).x(300).y(1100).pointer(2).delay(1)
.next()
.action(2).x(300).y(1000).pointer(2).delay(1)
.next()
.action(2).x(300).y(900).pointer(2).delay(1)
.next()
.action(1).x(300).y(800).pointer(2).delay(1);
var x = multiTouch(touch1, touch2, null, 30000);
logd("xxs " + x);
}
main();
```
# 滚动
## scrollForward(selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
向前滚动
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = scrollable(true);
var result = scrollForward(selector);
if (result){
toast("滚动成功");
} else {
toast("滚动失败");
}
}
main();
```
#### 查找可滚动组件
```js
// 获取可滚动组件的选择器
var selector = scrollable(true).visible(true);
// 获取节点属性
let className = getNodeAttrs(selector, 'clz');
logd('可滚动组件数量:' + className.length);
for (let value of className) {
logd(value);
}
```
#### 滚动抖音关注列表
```js
var slecctor = clz("androidx.recyclerview.widget.RecyclerView").scrollable(true).visible(true);
if (slecctor) {
if (scrollBackward(slecctor)) {
logd('滚动成功');
sleep(random(1000, 3000));
} else {
loge('滚动失败');
}
}
```
## scrollBackward(selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
向后滚动
@param selectors 选择器对象
@return {boolean|布尔型}
```js
function main(){
var selector = scrollable(true);
var result = scrollBackward(selector);
if (result){
toast("滚动成功");
} else {
toast("滚动失败");
}
}
main();
```
# 滑动
## swipe(selectors,endX,endY,duration)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
通过选择器滑动节点
@param selectors 节点选择器
@param endX 结束的X坐标
@param endY 结束的Y坐标
@param duration 持续时长 单位毫秒
@return 布尔型 true 代表成功 false 代表失败
```js
function main(){
var selectors = text("我是文本");
var result = swipe(selectors,100,100,200);
if (result){
toast("滑动成功");
} else {
toast("滑动失败");
}
}
main();
```
## swipeToPoint(startX,startY,endX,endY,duration)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
从一个坐标滑动到另一个坐标
@param startX 起始坐标的X轴值
@param startY 起始坐标的Y轴值
@param endX 结束坐标的X轴值
@param endY 结束坐标的Y轴值
@param duration 持续时长 单位毫秒
@return 布尔型 true 滑动成功, false 滑动失败
```js
function main(){
var result = swipeToPoint(10,10,100,100,200);
if (result){
toast("滑动成功");
} else {
toast("滑动失败");
}
}
main();
```
## isScrollEnd(distance,selectors)
> 执行条件:无障碍5.0以上或者手势执行为代理服务
是否滚动到底部了,如果查不到元素也会返回false
@param distance 滚动方向 UP,DOWN,LEFT,RIGHT
@param selectors 选择器
@return false 代表未滚动到位,true 代表滚动完成了
```js
function main(){
var selectors = clz("android.widget.ListView");
var result = isScrollEnd("UP",selectors);
if (result){
toast("滚动完成");
} else {
toast("滚动未完成");
}
}
main();
```
# 拖动
## drag(startX,startY,endX,endY,duration)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
从一个坐标到另一个坐标的拖动
@param startX 起始坐标的X轴值
@param startY 起始坐标的Y轴值
@param endX 结束坐标的X轴值
@param endY 结束坐标的Y轴值
@param duration 持续时长 单位毫秒
@return 布尔型 true 拖动成功, false 拖动失败
```js
function main(){
var result = drag(10,10,100,100,200);
if (result){
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
```
## dragTo(selectors,destObj,duration)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
通过选择器拖动某个元素到目标元素
@param selectors 选择器 {@link S}
@param destObj 目标元素选择器
@param duration 持续时长 单位毫秒
@return 布尔型 true 成功 false 失败
```js
function main(){
var selectors = text("设置");
var destObj = text("日历");
var result = dragTo(selectors,destObj,200);
if (result){
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
```
## dragToPoint(selectors,endX,endY,duration)
> 执行条件:无障碍7.0以上或者手势执行为代理服务
通过选择器拖动某个元素到目标X Y 坐标
@param selectors 原始元素选择器
@param endX 目标 X 坐标
@param endY 目标 Y 坐标
@param duration 持续时长 单位毫秒
@return 布尔型 true 成功 false 失败
```js
function main(){
var selectors = text("设置");
var result = dragToPoint(selectors,100,100,200);
if (result){
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
```
# 系统按键
## home()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
返回主页,可用于刷新节点
@return {null|布尔型}
```js
function main(){
var result = home();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
## power()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
模拟电源按键。
代理模式:息屏/亮屏
无障碍模式:弹出对话按钮
@return {null|布尔型}
```js
function main(){
var result = power();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
## back()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
返回键
@return {null|布尔型}
```js
function main(){
var result = back();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
## openNotification()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
打开通知栏
@return {null|布尔型}
```js
function main(){
var result = openNotification();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
## openQuickSettings()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
打开快速设置
@return {null|布尔型}
```js
function main(){
var result = openQuickSettings();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
## recentApps()
> 执行条件:无障碍5.0以上或者手势执行为代理服务
最近APP任务按键
@return {null|布尔型}
```js
function main(){
var result = recentApps();
if (result){
toast("成功");
} else {
toast("失败");
}
}
main();
```
#### 清理内存
```js
// 清理内存,需先锁定自身app
function clearMem() {
home();
if (recentApps()) {
sleep(1000);
let node = id("com.android.systemui:id/clearAnimView").getOneNodeInfo(5000);
if (node) {
return node.click();
} else {
return home();
}
}
return false;
}
```
# 通知栏
## requestNotificationPermission()
请求监听状态栏的权限
@param timeout 请求权限超时时间 单位是秒
@return true 代表请求权限成功,false代表失败
```js
function main(){
var result = requestNotificationPermission(10);
toast("是否有权限:"+result);
}
main();
```
## hasNotificationPermission()
检查是否含有状态栏监听权限
@return true 代表请求权限成功,false代表失败
```js
function main(){
var result = hasNotificationPermission();
toast("是否有权限:"+result);
}
main();
```
## getLastNotification()
获取最近通知栏对象
@param pkg 指定包名
@param size 指定获取的条数
@return {NotificationInfo数组|null}
```js
function main(){
var result = getLastNotification("com.x",100);
toast("结果:"+result);
}
main();
```
## shotNotification()
将通知发射处理,相当于点击了通知栏
@param seqId
@return {boolean|布尔型}
```js
function main(){
var result = getLastNotification("com.x",1);
if (result!=null && result.length>0){
var s = shotNotification(result[0].seqId);
toast("结果:"+s);
}
}
main();
```
## ignoreNotification()
忽略通知,从缓存队列移除,下次将不会获取
@param seqId
@return {boolean|布尔型}
```js
function main(){
var result = getLastNotification("com.x",1);
if (result!=null && result.length>0){
var s = ignoreNotification(result[0].seqId);
toast("结果:"+s);
}
}
main();
```
## cancelNotification()
将通知进行取消操作
@param seqId
@return {boolean|布尔型}
```js
function main(){
var result = getLastNotification("com.x",1);
if (result!=null && result.length>0){
var s = cancelNotification(result[0].seqId);
toast("结果:"+s);
}
}
main();
```
## getLastToast()
获取toast数据
@param pkg 指定包名
@param size 指定获取的条数
@return {null|ToastInfo数组}
```js
function main(){
var result = getLastToast("com.xx",100);
toast("结果:"+result);
}
main();
```
# 定时任务
## startJob()
开启一个定时脚本任务
@param tag 任务的唯一标示,不能为空,脚本中可以使用readConfigString("jobTaskTag")获取当前tag值,判断是那个任务过来执行的
@param execTime 定时时间格式: 2020-04-17 192000,或者直接是秒数字,例如 3,代表3秒后
@param cancelBeforeRunning
@return 整型 jobid
```js
function main(){
var time="2020-04-17 09:00:00";
//使用日期开启一个任务
var id =startJob("task1",time,true);
logd("job id "+id);
//使用秒数开启,60秒后执行一个任务
var id2 =startJob("task2","60",true);
logd("job id "+id2);
}
main();
```
## cancelAllJob()
取消所有定时
@return bool true 代表有任务被取消
```js
function main(){
var result = cancelAllJob();
logd(result);
}
main();
```
## cancelJob()
通过tag对定时任务进行取消
@param tag tag名称,startJob的时候tag参数的值
@return bool true 代表有任务被取消
```js
function main(){
var result = cancelJob("task1");
logd(result);
}
main();
```
## getAllJobTag()
取得所有的定时任务标签
@return 字符串数组或者null
```js
function main(){
var result = getAllJobTag();
logd(result);
}
main();
```
# 其他函数
## random()
取得某个范围的随机值
@param min 最小值
@param max 最大值
@return 整型 在min和max中间的值, 包含最大和最小值
```js
function main(){
var result = random(100,1000);
sleep(result);
}
main;
```