全局快捷事件

说明

全局模块中封装的快捷事件,不用区分是无障碍模式还是代理模式

手势事件模式

setGestureActionMode(mode)

设置各种手势模式事件的操作类型,默认是异步,目前只对无障碍模式有效

@param mode 1 代表异步,2代表同步
@param bool true代表成功 false代表失败

function main(){ setGestureActionMode(1); // setGestureActionMode(2); } main();

点击

click(selectors)

执行条件:无障碍7.0以上或者手势执行为代理服务

点击选择器

@param selectors 选择器对象
@return {boolean|布尔型}

function main(){ var selector = text("我是文本"); var result = click(selector); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

进入抖音个人中心

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|布尔型}

function main(){ var selector = text("我是文本"); var result = clickEx(selector); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

clickRandom(selectors)

执行条件:无障碍7.0以上或者手势执行为代理服务

随机点击选择器的任意元素

@param selectors 选择器对象
@return {boolean|布尔型}

function main(){ var selector = text("我是文本"); var result = clickRandom(selector); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

clickRandomEx(selectors)

执行条件:无障碍5.0以上或者手势执行为代理服务

随机点击选择器的任意元素

@param selectors 选择器对象
@return {boolean|布尔型}

function main(){ var selector = text("我是文本"); var result = clickRandomEx(selector); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

clickText(text)

执行条件:无障碍7.0以上或者手势执行为代理服务

点击文本

@param text 文本
@return {boolean|布尔型}

function main(){ var result = clickText("设置"); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

clickPoint(x,y)

执行条件:无障碍7.0以上或者手势执行为代理服务

点击坐标

@param x x坐标
@param y y坐标
@return {boolean|布尔型}

function main(){ var result = clickPoint(100,100); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

抖音视频点赞

// 模拟双击点赞 clickPoint(517,766); sleep(200); clickPoint(517,766);

longClickEx(selectors)

执行条件:无障碍5.0以上或者手势执行为代理服务

无指针方式长点击选择器,节点必须是可点击的

@param selectors 选择器对象
@return {boolean|布尔型}

function main(){ var selector = text("我是文本"); var result = longClickEx(selector); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

clickRandomRect(rect)

执行条件:无障碍7.0以上或者手势执行为代理服务

随机点击区域中的坐标

@param rect 区域对象
@return {boolean|布尔型}

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|布尔型}

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|布尔型}

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|布尔型}

function main(){ var result = longClickPoint(100,100); if (result){ toast("点击成功"); } else { toast("点击失败"); } } main();

输入

currentIsOurIme()

判断是否是自带输入法

@return {boolean|布尔型}

function main(){ var result = currentIsOurIme(); if (result){ toast("是"); } else { toast("否"); } } main();

inputText(selectors,content)

执行条件:无障碍5.0以上

通过选择器输入数据,输入前会清空输入框数据

@param selectors 选择器
@param content 数据字符串
@return {boolean|布尔型}

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|布尔型}

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|布尔型}

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列表中KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
@return {boolean|布尔型}

if(agentEvent.setCurrentIme()) { var selector = clz("android.widget.EditText"); if (selector) { logd(imeInputKeyCode(selector,66)); } else { toast("无节点"); } logd('恢复输入法:' + agentEvent.restoreIme()); } else { loge('设置输入法失败'); }

回车换行输入内容

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|布尔型}

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个手指的触摸点数组,例如:

[{"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|布尔型

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|布尔型}

function main(){ var selector = scrollable(true); var result = scrollForward(selector); if (result){ toast("滚动成功"); } else { toast("滚动失败"); } } main();

查找可滚动组件

// 获取可滚动组件的选择器 var selector = scrollable(true).visible(true); // 获取节点属性 let className = getNodeAttrs(selector, 'clz'); logd('可滚动组件数量:' + className.length); for (let value of className) { logd(value); }

滚动抖音关注列表

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|布尔型}

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 代表失败

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 滑动失败

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 代表滚动完成了

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 拖动失败

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 失败

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 失败

function main(){ var selectors = text("设置"); var result = dragToPoint(selectors,100,100,200); if (result){ toast("拖动成功"); } else { toast("拖动失败"); } } main();

系统按键

home()

执行条件:无障碍5.0以上或者手势执行为代理服务

返回主页,可用于刷新节点

@return {null|布尔型}

function main(){ var result = home(); if (result){ toast("成功"); } else { toast("失败"); } } main();

power()

执行条件:无障碍5.0以上或者手势执行为代理服务

模拟电源按键。
代理模式:息屏/亮屏
无障碍模式:弹出对话按钮

@return {null|布尔型}

function main(){ var result = power(); if (result){ toast("成功"); } else { toast("失败"); } } main();

back()

执行条件:无障碍5.0以上或者手势执行为代理服务

返回键

@return {null|布尔型}

function main(){ var result = back(); if (result){ toast("成功"); } else { toast("失败"); } } main();

openNotification()

执行条件:无障碍5.0以上或者手势执行为代理服务

打开通知栏

@return {null|布尔型}

function main(){ var result = openNotification(); if (result){ toast("成功"); } else { toast("失败"); } } main();

openQuickSettings()

执行条件:无障碍5.0以上或者手势执行为代理服务

打开快速设置

@return {null|布尔型}

function main(){ var result = openQuickSettings(); if (result){ toast("成功"); } else { toast("失败"); } } main();

recentApps()

执行条件:无障碍5.0以上或者手势执行为代理服务

最近APP任务按键

@return {null|布尔型}

function main(){ var result = recentApps(); if (result){ toast("成功"); } else { toast("失败"); } } main();

清理内存

// 清理内存,需先锁定自身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代表失败

function main(){ var result = requestNotificationPermission(10); toast("是否有权限:"+result); } main();

hasNotificationPermission()

检查是否含有状态栏监听权限

@return true 代表请求权限成功,false代表失败

function main(){ var result = hasNotificationPermission(); toast("是否有权限:"+result); } main();

getLastNotification()

获取最近通知栏对象

@param pkg 指定包名
@param size 指定获取的条数
@return {NotificationInfo数组|null}

function main(){ var result = getLastNotification("com.x",100); toast("结果:"+result); } main();

shotNotification()

将通知发射处理,相当于点击了通知栏

@param seqId
@return {boolean|布尔型}

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|布尔型}

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|布尔型}

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数组}

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

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 代表有任务被取消

function main(){ var result = cancelAllJob(); logd(result); } main();

cancelJob()

通过tag对定时任务进行取消

@param tag tag名称,startJob的时候tag参数的值
@return bool true 代表有任务被取消

function main(){ var result = cancelJob("task1"); logd(result); } main();

getAllJobTag()

取得所有的定时任务标签

@return 字符串数组或者null

function main(){ var result = getAllJobTag(); logd(result); } main();

其他函数

random()

取得某个范围的随机值

@param min 最小值
@param max 最大值
@return 整型 在min和max中间的值, 包含最大和最小值

function main(){ var result = random(100,1000); sleep(result); } main;