全局模块

# 说明 全局模块是指直接调用方法就可以使用的模块,无需使用前缀对象名称 全局函数在**无障碍模式下和代理模式下都可以调用**,不区分运行模式。 # 插件、模块加载 ## loadDex(path) 载入dex或者apk @param path 路径,加载顺序分别是插件目录(例如 ab.apk)或者是文件路径(例如 /sdcard/ab.apk)加载 @return true 载入成功, false载入失败 ```js function main(){ //类似这样会先从IEC文件的插件目录查找 //loadDex("ocr.apk"); //下面这个是从sdcard查找 loadDex("/sdcard/a.apk"); // a.apk中存在com.A这个这个类,可以直接使用 var obj = new com.A(); } main(); ``` #### 加载java文件中的class ```js // 混合开发 if (loadDex("defaultplugin.apk")) { importPackage(com.plugin.util); let utilsClass = new com.plugin.util.NetworkUtil(); if (utilsClass) { logd('是否联网:' + utilsClass.isNetConnected(context)); logd('运营商:' + utilsClass.getOperatorName(context)); logd('网络类型:' + utilsClass.getNetworkState(context)); logd('是否为WIFI:' + utilsClass.isWifiConnected(context)); logd('连接是否有效:' + utilsClass.isConnected(context)); logd('是否正在联网:' + utilsClass.isConnectedOrConnecting(context)); logd('移动连接:' + utilsClass.isMobileConnected(context)); logd('wifi可用:' + utilsClass.isWifiAvailable(context)); logd('移动网络可用:' + utilsClass.isMobileAvailable(context)); logd('移动网络开关:' + utilsClass.isMobileEnabled(context)); logd('网络可用:' + utilsClass.isAvailable(context)); } } else { loge("工具包加载失败"); } ``` ## require(path) 导入JS模块 @param path 路径,例如 本地/sdcard/a.js或者 EC工程中的文件路径 slib/a.js @return 模块对象 ```js function main(){ test = require("slib/a.js") logd(test.c()); } main(); ``` ## importClass(clz) 导入java的class给js用 @param clz class的名称例如: com.A ```js function main(){ importClass(com.A); var obj = new com.A(); } main(); ``` #### 检测网络是否正常 ```js // 网络检测 function isNetwork() { importClass(android.net.ConnectivityManager); var cm = context.getSystemService(context.CONNECTIVITY_SERVICE); var net = cm.getActiveNetworkInfo(); if (net == null || !net.isAvailable()) { return false; } else { return true; } } ``` ## importPackage(clz) 导入java包下面所有类给js用 @param clz class的名称例如: com.b ```js function main(){ importPackage(com.b); var obj = new com.b.A(); } main(); ``` #### 判断设备屏幕方向 ```js logd(getScreenDirection()); //判断设备屏幕方向:1竖屏;2横屏 function getScreenDirection() { importPackage(android.content); return context.getResources().getConfiguration().orientation; } ``` # 脚本启停 ## exit() 退出脚本 ## sleep(miSecond) 暂停执行、休眠 @param miSecond 毫秒 ```js function main(){ var result = sleep(1000); if (result){ toast("成功"); } else { toast("失败"); } } main(); ``` ## execScript(type,content) 执行JS文件或者内容 @param type 1=文件,2=直接是JS内容 @param content 路径例如/sdcard/a.js或者js的内容 @return 布尔型,true代表执行成功, false代表失败 ```js function main(){ var d ='while(true){sleep(1000);logd(111111);}'; thread.execAsync(function() { //execScript(1,"/sdcard/ad.js") execScript(2,d); }); while(true){ sleep(2000); loge("fsadffsad") } } main(); ``` ## restartScript(path,stopCurrent,delay) 重启脚本,适合无限循环,或者有异常的情况可以下载最新的iec再次执行,避免进入UI才能热更新 > 该方法威力巨大,请自行控制好是否自动重启,否则只能强杀进程才能停止 @param path 新的IEC路径,如果不需要可以填写null @param stopCurrent 是否停止当前的脚本 @param delay 延迟多少秒后执行 @return bool true 代表成功 false 代表失败 ```js function main(){ logd("我是在脚本运行的"); setStopCallback(function(){ restartScript(null,false,3) }); //setExceptionCallback(function (){ // restartScript(null,true,3) //}); sleep(1000); logd("脚本结束") } main(); ``` # 监听脚本和服务 ## setStopCallback() 脚本停止监听 ```js function main(){ setStopCallback(function (){ logd("fdsafsad 我是停止回调") }); var result = sleep(1000); if (result){ toast("成功"); } else { toast("失败"); } } main(); ``` ## setExceptionCallback() 脚本异常停止监听 ```js function main(){ setExceptionCallback(function (msg){ logd(" 异常停止消息: "+msg) }); var result = sleep(1000); if (result){ toast("成功"); } else { toast("失败"); } //这里有异常抛出 result.length(); } main(); ``` ## observeEvent(event,callback) (无障碍模式)对系统事件进行监听 @param event 事件类型 类型有: - activity-change 页面切换,OK - notification-show:状态栏通知展示, OK - toast-show:Toast消息展示, OK - key-down:按键按下, OK - key-up:按键弹起 OK - acc-service-interrupt:无障碍服务被中断 OK - acc-service-destroy: 无障碍服务被销毁 OK - acc-event:无障碍节点事件 OK - acc-service-connected: 无障碍服务连接成功 OK - auto-service-status: 自动化服务可用状态 @param callback 事件回调 @return {bool} | true 成功,false失败 ```js function main(){ startEnv(); logd("开始监听"); observeEvent("activity-change",function (key,data){ logd("页面切换: "+typeof data) logd("页面切换: "+data) }); //监听无障碍节点事件 observeEvent("acc-event",function (key,data){ logd("acc-event: "+typeof data) logd("acc-event: "+data) }); while(true){ sleep(1000) } //取消事件监听 cancelObserveEvent("acc-event") } main(); ``` #### 监听页面变化数据 ```js if(isAccMode()) { logd('无障碍模式'); observeEvent("acc-event",function (key,data){ logd("acc-event: "+typeof data) logd("acc-event: "+data) }); while(true){ sleep(1000) } } else { loge('非无障碍模式'); } ``` ## cancelObserveEvent(event) 取消对系统事件监听 @param event 事件类型 @return {bool} | true 成功,false失败 ```js function main(){ startEnv(); logd("开始监听"); observeEvent("activity-change",function (key,data){ logd("页面切换: "+typeof data) logd("页面切换: "+data) }); //监听无障碍节点事件 observeEvent("acc-event",function (key,data){ logd("acc-event: "+typeof data) logd("acc-event: "+data) }); sleep(10000) //取消事件监听 cancelObserveEvent("acc-event") } main(); ``` # 读取IEC包资源 ## readResString(fileName) 读取res文件夹中的资源文件,并返回字符串 @param fileName 文件名称,不要加res前缀 @return string 如果是null代表没内容 ```js function main(){ var testData = readResString("a.txt"); } main(); ``` ## readResBitmap(fileName) 读取res文件夹中的资源文件,并返Bitmap图片对象 @param fileName 文件名称,不要加res前缀 @return string 如果是null代表没内容 ```js function main(){ var b = readResBitmap("a.txt"); } main(); ``` ## readResAutoImage(fileName) 读取res文件夹中的资源文件,并返 AutoImage 图片对象 @param fileName 文件名称,不要加res前缀 @return string 如果是null代表没内容 ```js function main(){ var b = readResAutoImage("img/a.png"); } main(); ``` ## saveResToFile(fileName,path) 保存res文件夹中的资源文件到指定的路径 @param fileName 文件名称,不要加res前缀 @param path 要保存到的路径地址,例如/sdcard/aa.txt @return boolean|布尔型 true代表保存成功 ```js function main(){ var b = saveResToFile("img/a.png","/sdcard/a.png"); } main(); ``` # UI参数读取 ## readConfigString(key) 读取UI界面中的参数,返回是字符串 @param key 在UI界面中配置的key @return 字符串 找不到就返回空字符串 ```js function main(){ var testData = readConfigString("test_key"); } main(); ``` ## readConfigInt(key) 读取UI界面中的参数,返回是整型 @param key 在UI界面中配置的key @return 整型,找不到就返回0 ```js function main(){ var testData = readConfigInt("test_key"); } main(); ``` ## readConfigDouble(key) 读取UI界面中的参数,返回是Double型 @param key 在UI界面中配置的key @return double ```js function main(){ var testData = readConfigDouble("test_key"); } main(); ``` ## readConfigBoolean(key) 读取UI界面中的参数,返回是布尔型 @param key 在UI界面中配置的key @return true 或者 false ```js function main(){ var testData = readConfigDouble("test_key"); } main(); ``` ## deleteConfig(key) 删除配置值 @param key 在UI界面中配置的key @return {bool} true 代表成功 false 代表失败 ```js function main(){ var testData = deleteConfig("test_key"); } main(); ``` ## getConfigJSON() 取得配置的JSON @return JSON数据 ```js function main(){ var testData = getConfigJSON(); } main(); ``` ## updateConfig(key,value) 更新配置 @param key 键 @param value 值 @return {boolean} true 成功,false失败 ```js function main(){ updateConfig("a","sss"); } main(); ``` #### 封装简单的本地存储读写方法 ```js // Demo By 飞云编程学院 logd(setStorageData('feiyun', 'http://www.feiyunjs.com')); logi(getStorageData('feiyun')); //保存本地数据 function setStorageData(key, value) { return updateConfig(key, value); } //读取本地数据 function getStorageData(key) { let result = readConfigString(key); if (result) { return result; } else { //找不到则返回undefined } } //删除本地数据 function delStorageData(key) { return deleteConfig(key); } ``` # 系统设置 ## setECSystemConfig(params) 设置EC的系统参数 @param params map形式例如 ```js { "running_mode":"无障碍", "auto_start_service":"是", "log_float_window":"否", "ctrl_float_window":"否" } ``` 参数解释有: - running_mode : 运行模式 值有 无障碍,代理两种 - auto_start_service: 开机自启动 值有 是,否 两种 - log_float_window : 日志悬浮窗展示 值有 是,否 两种 - ctrl_float_window : 启停控制悬浮窗展示 值有 是,否 两种 @return 布尔型 true 是 false 否 ```js function main(){ var m = { "node_service":"需要", "proxy_service":"不需要", "running_mode":"无障碍", "log_float_window":"否", "ctrl_float_window":"否" }; setECSystemConfig(m); } main(); ``` ## openECSystemSetting() 打开EC系统设置页面 @return true 成功 false 失败 ```js function main(){ var result = openECSystemSetting(); } main(); ``` ## openECloudSetting() 打开EC云控界面 @return true 成功 false 失败 ```js function main(){ var result = openECloudSetting(); } main(); ``` # 设置IEC文件(脚本中的热更新) ## setIECPath() 设置要执行的IEC文件路径 @return true 成功 false 失败 ```js function main(){ var result = setIECPath("/sdcard/release.iec"); logd("result : "+result); logd("当前路径 "+getIECPath()); //开启定时任务准备下一次执行 var id2 =startJob("task2","2",true); logd("job id "+id2); } main(); ``` # 运行模式 ## isAccMode() 是否是无障碍模式 @return true或者false ```js function main(){ var result = isAccMode(); } main(); ``` ## isAgentMode() 是否是代理模式 @return true或者false ```js function main(){ var result = isAgentMode(); } main(); ``` ## isServiceOk() 自动化服务是否正常 @return true或者false ```js function main(){ var result = isServiceOk(); } main(); ``` ## startEnv() 启动自动化服务环境 @return true或者false ```js function main(){ var result = startEnv(); } main(); ``` ## closeEnv() 关闭自动化服务环境 适用版本(EC 5.14.0+) @return true或者false ```js function main(){ var result = closeEnv(); } main(); ``` ## activeSelf() 激活自己 条件:1 开启USB调试,2 开启本机ADB WIFI调试,请参考激活章节文档 > 适用版本(EC 5.15.0+) @param activeType 激活类型,0 自动,1 模式1 2 模式2 @param timeout 超时时间 @return {string} 激活成功:代表成功,其他都是错误消息 ```js function main(){ var result = activeSelf(0,10*1000); logd(result) } main(); ``` ## activeDevice() 通过设备的IP激活设备 条件:1 开启目标设备USB调试,2 开启目标设备ADB WIFI调试,请参考激活章节文档 > 适用版本(EC 5.15.0+) @param ip 设备的IP @param activeType 激活类型,0 自动,1 模式1 2 模式2 @param timeout 超时时间 @return {string} 激活成功:代表成功,其他都是错误消息 ```js function main(){ var result = activeDevice("192.168.1.108",0,10*1000); logd(result) } main(); ``` #### 自动启动服务 ```js /** @description 自动启动服务 @param time:失败后重启次数 @return boolean:返回是否启动成功 */ function autoServiceStart(time) { if (isAccMode()) { logd('运行模式:无障碍'); } else if (isAgentMode()) { logd('运行模式:代理'); } else { loge('运行模式:未知'); } for (var i = 0; i < time; i++) { if (isServiceOk()) { return true; } else { var started = startEnv(); logd("第" + (i + 1) + "次启动服务: " + started); if (isServiceOk()) { return true; } } } return isServiceOk(); }; ``` # 时间 ## time() > 适用版本(EC 5.14.0+) 毫秒时间函数 @return {long} 毫秒级别的long时间 ```js function main(){ logd(time()); } main(); ``` ## timeFormat() > 适用版本(EC 5.14.0+) 格式化时间函数例如:yyyy-MM-dd HH:mm:ss @return {string} 格式化之后的当前时间 ```js function main(){ logd(timeFormat("yyyy-MM-dd HH:mm:ss")); } main(); ``` ## console.time() > 适用版本(EC 5.14.0+) 计时开始,和timeEnd成对出现计算用时 @param label 标签 @return {long} 当前时间 ```js function main(){ console.time("1"); sleep(1000) logd(console.timeEnd("1")) } main(); ``` ## console.timeEnd() > 适用版本(EC 5.14.0+) 计时结束,和timeEnd成对出现计算用时 @param label 标签 @return {long} 与计时开始的差值 ```js function main(){ console.time("1"); sleep(1000) logd(console.timeEnd("1")) } main(); ```