全局快捷事件

# 说明 全局模块中封装的快捷事件,不用区分是无障碍模式还是代理模式 # 手势事件模式 ## 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; ```