panchengyong
10 days ago b2d3f7caf927e5b83ec52efb74f1f818dbb15236
commit | author | age
bc5e1e 1 var modules = {};
X 2
3 function Console() {
4     this.timerMap = {}
5 }
6
7 Console.prototype.log = function (msg) {
8     var s = [];
9     for (var i = 1; i < arguments.length; i++) {
10         s.push(arguments[i]);
11     }
12     ecImporter.logd(formatlog(msg), s);
13 }
b2d3f7 14 Console.prototype.info = function (msg) {
P 15     var s = [];
16     for (var i = 1; i < arguments.length; i++) {
17         s.push(arguments[i]);
18     }
19     ecImporter.logi(formatlog(msg), s);
20 }
21 Console.prototype.warn = function (msg) {
22     var s = [];
23     for (var i = 1; i < arguments.length; i++) {
24         s.push(arguments[i]);
25     }
26     ecImporter.logw(formatlog(msg), s);
27 }
28 Console.prototype.error = function (msg) {
29     var s = [];
30     for (var i = 1; i < arguments.length; i++) {
31         s.push(arguments[i]);
32     }
33     ecImporter.loge(formatlog(msg), s);
34 }
bc5e1e 35 Console.prototype.logLine = function (line, msg) {
b2d3f7 36     if (arguments.length <= 0) {
P 37         return
38     }
bc5e1e 39     var s = [];
X 40     for (var i = 2; i < arguments.length; i++) {
41         s.push(arguments[i]);
42     }
43     ecImporter.logdLine(line, formatlog(msg), s);
44 }
45
b2d3f7 46 Console.prototype.infoLine = function (line, msg) {
P 47     var s = [];
48     for (var i = 2; i < arguments.length; i++) {
49         s.push(arguments[i]);
50     }
51     ecImporter.logiLine(line, formatlog(msg), s);
52 }
53
54 Console.prototype.warnLine = function (line, msg) {
55     var s = [];
56     for (var i = 2; i < arguments.length; i++) {
57         s.push(arguments[i]);
58     }
59     ecImporter.logwLine(line, formatlog(msg), s);
60 }
61
62 Console.prototype.errorLine = function (line, msg) {
63     var s = [];
64     for (var i = 2; i < arguments.length; i++) {
65         s.push(arguments[i]);
66     }
67     ecImporter.logeLine(line, formatlog(msg), s);
68 }
bc5e1e 69 /**
X 70  * 计时开始
71  * @param label 标签
b2d3f7 72  * @return  {number} 当前时间
bc5e1e 73  */
X 74 Console.prototype.time = function (label) {
75     let t = ecImporter.time();
76     this.timerMap[label] = t;
77     return t;
78 }
79
80
81 /**
82  * 计时结束
83  * @param label 标签
b2d3f7 84  * @return {number} 与计时开始的差值
bc5e1e 85  */
X 86 Console.prototype.timeEnd = function (label) {
87     let t1 = ecImporter.time();
88     let d2 = this.timerMap[label];
89     if (d2 == null || d2 == undefined) {
90         return 0;
91     }
92     let t2 = t1 - d2;
93     delete this.timerMap[label];
94     return t2;
95 }
96
97 var console = new Console();
98
99
100 function HotUpdateWrapper() {
101
102 }
103
104 var hotupdater = new HotUpdateWrapper();
105
106 /**
107  * 获取热更新得请求结果
108  * @return {string} 字符串
109  */
110 HotUpdateWrapper.prototype.getUpdateResp = function () {
111     return ecImporter.getHotUpdateResp();
112 }
113
114 /**
115  * 获取热更新重新的错误
116  * @return {string} 字符串
117  */
118 HotUpdateWrapper.prototype.getErrorMsg = function () {
119     return ecImporter.hotUpdateErrorMsg();
120 }
121
122 /**
123  * 请求热更新接口,如果是false,也有可能是无需更新,可以使用getErrorMsg查看具体得信息
124  * @param updateUrl 更新地址 不写,就使用update.json配置的数据
125  * @param version 当前版本,使用整形数据,例如 1这样的数字
126  * @param appendDeviceInfo 是否拼接设备信息数据 true 或者 false
127  * @param timeout 请求超时时间 单位是毫秒
b2d3f7 128  * @return {boolean} true 代表需要更新 false代表无需更新
bc5e1e 129  */
X 130 HotUpdateWrapper.prototype.updateReq = function (updateUrl, version, appendDeviceInfo, timeout) {
131     return ecImporter.hotUpdateReq(updateUrl, version, appendDeviceInfo, timeout);
132 }
133
134
135 /**
136  * 下载热更新请求到得IEC文件
137  * @return {string} 下载后热更新文件得路径,如果为空,也有可能是无需更新
138  */
139 HotUpdateWrapper.prototype.updateDownload = function () {
140     return ecImporter.hotUpdateDownload();
141 }
142
143
144 /**
145  * 发送钉钉消息
146  * 适合EC 9.11.0+
147  * @param url 群组/部门 机器人Webhook地址
148  * @param secret 群组/部门 机器人Webhook密钥, 可以不写使用关键字过滤方式
149  * @param msg 要发送的消息
150  * @param atMobile at手机号,多个用英文逗号隔开
151  * @param atAll 是否at所有人,写true或者false
152  * @return {string} 调用钉钉返回的json字符串结果,格式 {"errcode":0,"errmsg":"ok"},errcode=0代表成功其他都是错误
153  */
154 function sendDingDingMsg(url, secret, msg, atMobile, atAll) {
155     return ecImporter.sendDingDingMsg(url, secret, msg, atMobile, atAll);
156 }
157
158 /**
159  * 休眠
160  * @param miSecond 毫秒
161  */
162 function sleep(miSecond) {
163     ecImporter.sleep(miSecond);
164 }
165
166 /**
167  * 脚本是否处于暂停中
168  * 适配 EC 10.0.0+
169  * @return {boolean} true 代表脚本处于暂停中
170  */
171 function isScriptPause() {
172     return pauseScriptWrapper.isScriptPause();
173 }
174
175 /**
176  * 设置脚本暂停或者继续
177  * 适配 EC 10.0.0+
178  * @param pause true 代表暂停脚本,false代表继续
179  * @param timeout 自动恢复时间单位毫秒,0 代表不自动恢复,等待外部交互后恢复,大于0代表到了时间自动恢复运行
180  * @return {boolean} true 代表脚本处于暂停中,false 代表继续运行中
181  */
b2d3f7 182 function setScriptPause(pause, timeout) {
P 183     pauseScriptWrapper.setScriptPause(pause, timeout);
bc5e1e 184     return pauseScriptWrapper.isScriptPause();
X 185 }
186
187
188 function toast(msg, extra) {
189     if (extra) {
190         ecImporter.toastWithSetting(msg, JSON.stringify(extra));
191     } else {
192         ecImporter.toast(msg);
193     }
194 }
195
196 function toast1(msg) {
197     ecImporter.toast1(msg);
198 }
199
200 function toast2(msg) {
201     ecImporter.toast2(msg);
202 }
203
204 function getHandler() {
205     return ecImporter.getHandler();
206 }
207
208
209 function formatlog(obj) {
b2d3f7 210     return obj + "";
bc5e1e 211 }
X 212
213 /**
214  * 设置日志等级,可用于关闭或开启日志
215  * @param level 日志等级,值分别是 debug,info,warn,error,off,排序分别是debug<info<warn<error<off,
216  * 例如 off代表关闭所有级别日志,debug代表打印包含logd,logi,logw,loge的日志,info代表打印包含logi,logw,loge的日志,warn 代表打印包含logw,loge的日志
217  * @param displayToast 是否展示toast消息
b2d3f7 218  * @return {boolean} 布尔型 true代表成功 false代表失败
bc5e1e 219  */
X 220 function setLogLevel(level, displayToast) {
221     ecImporter.setLogLevel(level, displayToast);
222     return true;
223 }
224
225
226 /**
227  * 调试日志
228  * @param msg
229  */
230 function logd(msg) {
231     var s = [];
232     for (var i = 1; i < arguments.length; i++) {
233         s.push(arguments[i]);
234     }
235     ecImporter.logd(formatlog(msg), s);
236 }
237
238
239 function logdLine(line, msg) {
240     var s = [];
241     for (var i = 2; i < arguments.length; i++) {
242         s.push(arguments[i]);
243     }
244     ecImporter.logdLine(line, formatlog(msg), s);
245 }
246
247
248 /**
249  * 信息日志
250  * @param msg
251  */
252 function logi(msg) {
253     var s = [];
254     for (var i = 1; i < arguments.length; i++) {
255         s.push(arguments[i]);
256     }
257     ecImporter.logi(formatlog(msg), s);
258 }
259
260
261 function logiLine(line, msg) {
262     var s = [];
263     for (var i = 2; i < arguments.length; i++) {
264         s.push(arguments[i]);
265     }
266     ecImporter.logiLine(line, formatlog(msg), s);
267 }
268
269
270 /**
271  * 错误日志
272  * @param msg
273  */
274 function loge(msg) {
275     var s = [];
276     for (var i = 1; i < arguments.length; i++) {
277         s.push(arguments[i]);
278     }
279     ecImporter.loge(formatlog(msg), s);
280 }
281
282
283 function logeLine(line, msg) {
284     var s = [];
285     for (var i = 2; i < arguments.length; i++) {
286         s.push(arguments[i]);
287     }
288     ecImporter.logeLine(line, formatlog(msg), s);
289 }
290
291 /**
292  * 警告日志
293  * @param msg
294  */
295 function logw(msg) {
296     var s = [];
297     for (var i = 1; i < arguments.length; i++) {
298         s.push(arguments[i]);
299     }
300     ecImporter.logw(formatlog(msg), s);
301 }
302
303
304 function logwLine(line, msg) {
305     var s = [];
306     for (var i = 2; i < arguments.length; i++) {
307         s.push(arguments[i]);
308     }
309     ecImporter.logwLine(line, formatlog(msg), s);
310 }
311
312
313 /**
314  * 设置保存日志信息到文件中
315  * @param save 是否保存
316  * @param path 自定义的文件夹
317  * @param size 每个文件分隔的尺寸
318  * @return 保存日志文件的目录
319  */
320 function setSaveLogEx(save, path, size, fileName) {
321     return ecImporter.setSaveLog(save, path, fileName, size);
322 }
323
324 function setSaveLog(save, path, size) {
325     return ecImporter.setSaveLog(save, path, null, size);
326 }
327
328 /**
329  * 打印日志的时候,悬浮窗是否展示行号,正式发布,可以不展示行号,不影响调试和保存在文件的日志
b2d3f7 330  * @param {boolean}  true 代表显示, false 不显示
bc5e1e 331  */
X 332 function setFloatDisplayLineNumber(ds) {
333     return ecImporter.setFloatDisplayLineNumber(ds);
334 }
335
336
337 /**
338  * 清除日志
339  * @param lines 整型,要清除的行数,-1 代表全部清除
340  */
341 function clearLog(lines) {
342     ecImporter.clearLog(lines);
343 }
344
345 /**
346  * 打开EC系统设置页面
b2d3f7 347  * @return {boolean} true 成功 false 失败
bc5e1e 348  */
X 349 function openECSystemSetting() {
350     return ecImporter.openECSystemSetting();
351 }
352
353 /**
354  * 打开EC云控设置
b2d3f7 355  * @return {boolean} true 成功 false 失败
bc5e1e 356  */
X 357 function openECloudSetting() {
358     return ecImporter.openECloudSetting();
359 }
360
361
362 /**
363  * 设置EC的系统参数
364  * @param params  map形式例如 {"running_mode":"无障碍"},<br/>
365  * {<br/>
366  *     "node_service":"需要",<br/>
367  *     "proxy_service":"不需要",<br/>
368  *     "running_mode":"无障碍",<br/>
369  *     "auto_start_service":"是",<br/>
370  *     "daemon_service":"是",<br/>
371  *      "volume_start_tc":"否",<br/>
372  *      "log_float_window":"否",<br/>
373  *      "ctrl_float_window":"否"<br/>
374  * }<br/>
375  *  参数解释有:<br/>
376  *  node_service : 是否需要启动节点获取服务 值有 需要,不需要两种
377  *  proxy_service : 是否需要启动底层代理服务 值有 需要,不需要两种
378  *  running_mode : 手势执行服务 值有 无障碍,代理两种
379  *  auto_start_service : 开机启动服务 值有 是,否 两种
380  *  daemon_service : 守护服务 值有 是,否 两种
381  *  volume_start_tc : 音量键启停 值有 是,否 两种
382  *  log_float_window : 日志悬浮窗展示 值有 是,否 两种
383  *  ctrl_float_window : 启停控制悬浮窗展示 值有 是,否 两种
384  *
b2d3f7 385  * @return {boolean} true 是 false 否
bc5e1e 386  */
X 387 function setECSystemConfig(params) {
388     return ecImporter.setECSystemConfig(JSON.stringify(params));
389 }
390
391
392 /**
393  * 载入dex文件
394  * @param path 路径,加载顺序分别是插件目录(例如 ab.apk)或者是文件路径(例如 /sdcard/ab.apk)加载
b2d3f7 395  * @return {boolean} true 载入成功, false载入失败
bc5e1e 396  */
X 397 function loadDex(path) {
398     return ecImporter.loadDex(path);
399 }
400
401 /**
402  * 设置重复加载dex,apk,防止插件过大导致加载时间过长
403  * @param r 是否重复加载,true 可以重复加载,false 不可以重复加载
b2d3f7 404  * @return {boolean} true 载入成功, false载入失败
bc5e1e 405  */
X 406 function setRepeatLoadDex(r) {
407     return ecImporter.setRepeatLoadDex(r);
408 }
409
410
411 /**
412  * 执行JS文件或者内容
413  * @param type 1=文件,2=直接是JS内容
414  * @param content 路径例如/sdcard/a.js或者js的内容
b2d3f7 415  * @return {boolean} true代表执行成功, false代表失败
bc5e1e 416  */
X 417 function execScript(type, content) {
418     if (type == 1) {
419         content = file.readFile(content);
420     }
421     if (content != undefined && content != null) {
422         if (content.length > 0) {
423             eval(content);
424             return true;
425         }
426     }
427     return false;
428     //return ecImporter.execScript(type, content);
429
430 }
431
432 /**
433  * 载入jar文件
434  * @param path 路径,加载顺序分别是插件目录(例如 ab.jar)或者是文件路径(例如 /sdcard/ab.jar)加载
b2d3f7 435  * @return {boolean} true 载入成功, false载入失败
bc5e1e 436  */
X 437 function loadJar(path) {
438     return ecImporter.loadJar(path);
439 }
440
441 /**
442  * 退出脚本执行
443  */
444 function exit() {
445     ecImporter.exit();
446 }
447
448
449 /**
450  * 判断EC运行的当前线程是否处于退出状态,可用判断脚本是否退出,或者子线程是否退出
b2d3f7 451  * @return {boolean} true 已退出
bc5e1e 452  */
X 453 function isScriptExit() {
454     return ecImporter.isScriptExit();
455 }
456
457 /**
458  * 重启脚本,适合无限循环,或者有异常的情况可以下载最新的iec再次执行,避免进入UI才能热更新,
459  * 注意: 该方法威力巨大,请自行控制好是否自动重启,否则只能强杀进程才能停止
460  * @param path 新的IEC路径,如果不需要可以填写null
461  * @param stopCurrent 是否停止当前的脚本
462  * @param delay 延迟多少秒后执行
b2d3f7 463  * @return {boolean} true 代表成功 false 代表失败
bc5e1e 464  */
X 465 function restartScript(path, stopCurrent, delay) {
466     return ecImporter.restartScript(path, stopCurrent, delay);
467 }
468
469
470 /**
471  * 保存res文件夹中的资源文件到指定的路径
472  * @param fileName 文件名称,不要加res前缀
473  * @param path 要保存到的路径地址,例如/sdcard/aa.txt
b2d3f7 474  * @return {boolean} true代表保存成功
bc5e1e 475  */
X 476 function saveResToFile(fileName, path) {
477     return ecImporter.saveResToFile(fileName, path);
478 }
479
480 /**
481  * 读取res文件夹中的资源文件,并返回字符串
482  * @param fileName 文件名称,不要加res前缀
b2d3f7 483  * @return {null|string} 如果是null代表没内容
bc5e1e 484  */
X 485 function readResString(fileName) {
486     return javaString2string(ecImporter.readResString(fileName));
487 }
488
489 /**
490  * 查找IEC的文件
491  * 适合版本 EC 8.0.0+
492  * @param dir       文件夹名称,null代表只读res/文件夹,没有默认是res文件夹,可以是类似 res/aaa/这样的文件夹
493  * @param names     文件名称前缀,null代表不匹配, 例如aaa,多个前缀用|分割,例如 aaa|bb|cc
494  * @param ext       文件扩展名 ,null代表不匹配,例如.png,多个扩展用|分割,例如 .png|.jpg|.bmp
495  * @param recursion 是否递归子目录,true代表递归
b2d3f7 496  * @return {null|JSON} 文件名称JSON数组
bc5e1e 497  */
X 498 function findIECFile(dir, names, ext, recursion) {
499     let s = ecImporter.findIECFile(dir, names, ext, recursion);
500     if (s == null) {
501         return null;
502     }
503     s = javaString2string(s);
504     try {
505         return JSON.parse(s);
506     } catch (e) {
507         return null;
508     }
509     return null;
510 }
511
512
513 /**
514  * 读取IEC文件中的资源文件,并返回字符串
515  * @param fileName 文件名称,如果放在某个文件夹下 需要加上文件名称
b2d3f7 516  * @return {null|string} 如果是null代表没内容
bc5e1e 517  */
X 518 function readIECFileAsString(fileName) {
519     return javaString2string(ecImporter.getPkgContent(fileName));
520 }
521
522 /**
523  * 读取IEC文件中的资源文件,并返回java的直接数组
524  * @param fileName 文件名称,如果放在某个文件夹下 需要加上文件名称
b2d3f7 525  * @return {null|字节数组|*} 如果是null代表没内容
bc5e1e 526  */
X 527 function readIECFileAsByte(fileName) {
528     return ecImporter.getPkgContentAsByte(fileName);
529 }
530
531
532 /**
533  * 读取res文件夹中的资源文件,并返Bitmap图片对象
534  * @param fileName 文件名称,不要加res前缀
b2d3f7 535  * @return {null|Bitmap} 如果是null代表没内容
bc5e1e 536  */
X 537 function readResBitmap(fileName) {
538     return ecImporter.readResBitmap(fileName);
539 }
540
541
542 /**
543  * 启动自动化环境
b2d3f7 544  * @return {boolean}  true代表启动成功,false代表启动失败
bc5e1e 545  */
X 546 function startEnv() {
547     return ecImporter.startEnv();
548 }
549
550 /**
551  * 守护自动化环境,
552  * 如果是激活或者无障碍保活的情况下,尽量保证自动服务不掉线
553  * @param daemon 是否守护自动化环境 true 是,false 否
b2d3f7 554  * @return {boolean}  true代表启动成功,false代表启动失败
bc5e1e 555  */
X 556 function daemonEnv(daemon) {
557     return ecImporter.setDaemonAutoService(daemon);
b2d3f7 558 }
P 559
560 /**
561  * 设置代理模式下获取节点方式
562  * 该方法仅对代理模式生效
563  * EC 安卓 11.2.0+
564  * 该方法在启动代理服务之前调用,使用2和3 可以减少检测的特征
565  * 1的方式会出现 ruru检测出 AccessibilityManager.isEnabled,2和其他的方式不会出现
566  * 1的方式节点能力交强,2节点功能较弱,0和3 就没有节点功能
567  * @param support 1 类似无障碍一样的方式, 2 shell dump的的方式,3或者0 不开启节点服务
568  * @return {boolean} true
569  */
570 function setAgentSupportNode(support) {
571     return ecImporter.setAgentSupportNode(support + "");
572 }
573
574 /**
575  * 获取打包混淆后的真实组件名称
576  * @param name 原始名称
577  * @return {string}  真实的类名
578  */
579 function getComponentRealName(name) {
580     return ecImporter.getComponentRealName(name);
bc5e1e 581 }
X 582
583
584 /**
585  * 关闭自动化环境
586  * @param skinAccPage 无障碍模式停止失败 是否跳转到开启无障碍页面
b2d3f7 587  * @return {boolean}  true代表启动成功,false代表启动失败
bc5e1e 588  */
X 589 function closeEnv(skinAccPage) {
590     return ecImporter.closeEnv(skinAccPage);
591 }
592
593 /**
594  * 设置壁纸服务函数
b2d3f7 595  * @return {boolean}  true代表启动成功,false代表启动失败
bc5e1e 596  */
X 597 function setWallpaperService() {
598     return ecImporter.setWallpaperService();
599 }
600
601 /**
602  * 是否设置壁纸成功
b2d3f7 603  * @return {boolean}  true代表成功,false代表失败
bc5e1e 604  */
X 605 function isWallpaperServiceSet() {
606     return ecImporter.isWallpaperServiceSet();
607 }
608
609
610 /**
611  * 自动化服务是否正常
b2d3f7 612  * @return {boolean}  true代表正常,false代表不正常
bc5e1e 613  */
X 614 function isServiceOk() {
615     return ecImporter.isServiceOk();
616 }
617
618 /**
619  * 设置要执行的IEC文件路径
620  * @param path 文件路径
b2d3f7 621  * @return {boolean} true代表成功  false代表失败
bc5e1e 622  */
X 623 function setIECPath(path) {
624     return ecImporter.setIECPath(path);
625 }
626
627
628 /**
629  * 获取要执行的IEC文件路径
b2d3f7 630  * @return {null|string} null代表无。ts.iec 代表是包内iec文件,其他代代表存储路径中的文件
bc5e1e 631  */
X 632 function getIECPath() {
633     return ecImporter.getIECPath();
634 }
635
636 function javaString2string(x) {
637     if (x == null) {
638         return null;
639     }
640     return "" + x;
641 }
642
643 function setStopCallback(callback) {
644     ecImporter.onScriptStopCallback(callback);
645 }
646
647 function setExceptionCallback(callback) {
648     ecImporter.onScriptExCallback(callback);
649 }
650
651 /**
652  * 对事件进行监听
653  * @param event 事件类型 类型有:
654  * activity-change 页面切换,OK
655  * notification-show:状态栏通知展示, OK
656  * toast-show:Toast消息展示, OK
657  * key-down:按键按下, OK
658  * key-up:按键弹起 OK
659  * acc-service-interrupt:无障碍服务被中断 OK
660  * acc-service-destroy: 无障碍服务被销毁 OK
661  * acc-event:无障碍节点事件 OK
662  * acc-service-connected: 无障碍服务连接成功 OK
663  * auto-service-status: 自动化服务可用状态
664  *
665  * @param callback 事件回调
b2d3f7 666  * @return {boolean}  | true 成功,false失败
bc5e1e 667  */
X 668 function observeEvent(event, callback) {
669     return observeEvents.on(event, callback);
670 }
671
672 /**
673  * 取消事件监听
674  * @param event 事件类型
b2d3f7 675  * @return {boolean} | true 成功,false失败
bc5e1e 676  */
X 677 function cancelObserveEvent(event) {
678     return observeEvents.cancelEvent(event);
679 }
680
681 /**
682  * 时间函数
b2d3f7 683  * @return {number} 毫秒级别的long时间
bc5e1e 684  */
X 685 function time() {
686     return ecImporter.time();
687 }
688
689 /**
690  * 申请动态权限
691  * 适合版本 EC 7.9.0+
692  * @param permissionArray 动态权限数组,可以是多个
693  * @timeout 申请超时时间 单位是毫秒
b2d3f7 694  * @return {boolean} true 代表有权限  false代表无权限或申请失败
bc5e1e 695  */
X 696 function requestRuntimePermission(permissionArray, timeout) {
697     if (permissionArray == null || permissionArray == undefined) {
698         return false;
699     }
700     let d = JSON.stringify(permissionArray)
701     return ecImporter.requestRuntimePermission(d, timeout);
702 }
703
704
705 /**
706  * 格式化时间函数例如:yyyy-MM-dd HH:mm:ss
707  * @return {string} 格式话之后的当前时间
708  */
709 function timeFormat(format) {
710     return ecImporter.timeFormat(format);
711 }
712
713 function object2JsonString(o) {
714     if (o == null) {
715         return "{}";
716     }
717     if ((typeof o) === 'string') {
718         return o;
719     }
720     return JSON.stringify(o);
721 }
722
723 /**
724  * 激活自己
725  * @param activeType 激活类型,0 自动,1 模式1 2 模式2
726  * @param timeout 超时时间
727  * @return {string} 激活成功:代表成功,其他都是错误消息
728  */
729 function activeSelf(activeType, timeout) {
730     return ecImporter.activeSelf(activeType, timeout);
731 }
732
733 /**
734  * 通过IP激活其他设备
735  * @param ip 设备的IP
736  * @param activeType 激活类型,0 自动,1 模式1 2 模式2
737  * @param timeout 超时时间
738  * @return {string} 激活成功:代表成功,其他都是错误消息
739  */
740 function activeDevice(ip, activeType, timeout) {
741     return ecImporter.activeDevice(ip, activeType, timeout);
742 }
743
744 //
745 ///**
746 // * 获取当前代码执行行号
747 // * 适配EC 安卓 9.16.0+
748 // * @param data 这个必须写null否则获取不到正确行号
749 // * @return {int} -1 代表没获取到
750 // */
751 //function getCodeLine(data){
752 //    return ecImporter.getCodeLine(data);
753 //}
754
755 /**
756  * 是否同步日志到中控
757  * 适合版本 EC 安卓 9.27.0+
758  * @param logSyncToCenter true代表同步  false代表不同步
759  */
760 function commonLogToCenter(logSyncToCenter) {
761     ecImporter.commonLogToCenter(logSyncToCenter);
762 }
763
764 /**
765  * 取得中控发过来的任务参数信息
766  * 中控启动脚本,可以配置参数,在这里使用本函数获取参数,给脚本使用
767  * 适合版本 EC 安卓 9.27.0+
768  * 注意:这个需要使用参数配置,读取顺序是 优先读取单个设备配置 ,如果单个设备配置无任何数据,就读取 全局配置,
769  * 返回参数中 含有 __from_global__ 这样的key,代表是来源于全局参数
b2d3f7 770  * @return {null|JSON} 对象
bc5e1e 771  **/
X 772 function getCenterTaskInfo() {
773     let x = ecImporter.getCenterTaskInfo();
774     if (x != null && x != undefined && x != "") {
775         try {
776             return JSON.parse(x)
777         } catch (e) {
778         }
779     }
780     return null;
781 }
782
783
b2d3f7 784 /**
P 785  * 获取截图自允许权限
786  * 代理模式忽略这函数,这个适合弹窗权限截图模式
787  * 适配EC 10.25.0+
788  * 在有shell或者root权限执行,申请完毕可以关闭shell和root
789  * 尝试获取截图自动允许权限,申请截图不会弹窗
790  * @return {boolean} true 代表成功 false代表失败
791  */
792 function tryGetProjectionPermission() {
793     return ecImporter.tryGetProjectionPermission()
794 }
795
796
797 /**
798  * 获取无障碍自允许权限
799  * 有权限后 无障碍可以自动启动
800  * 适配EC 10.25.0+
801  * 在有shell或者root权限执行,申请完毕可以关闭shell和root
802  * 尝试获取无障碍自动化允许的权限
803  * @return {boolean} true 代表成功 false代表失败
804  */
805 function tryGetAccStartupPermission() {
806     return ecImporter.tryGetAccStartupPermission()
807 }