diff --git a/404.html b/404.html index eef35bd..a7a2047 100644 --- a/404.html +++ b/404.html @@ -27,11 +27,11 @@ AutoX - - + + -

404

Looks like we've got some broken links.
Take me home
- +

404

How did we get here?
Take me home
+ diff --git a/Tessract.html b/Tessract.html index 8b41371..f42d115 100644 --- a/Tessract.html +++ b/Tessract.html @@ -27,11 +27,11 @@ Tessract | AutoX - - + +

Tessract 6.2.9 实验

前往 github 下载完整例子:Tessract OCRopen in new window

- + diff --git a/app.html b/app.html index b5b3849..f8197c6 100644 --- a/app.html +++ b/app.html @@ -27,8 +27,8 @@ 应用交互-app | AutoX - - + +

应用交互-app

稳定

app

该模块允许你与其他应用程序进行交互。你可以启动其他应用程序,发送 Intent 意图,打开文件,发送电子邮件等。

app.versionCode

  • return {number}

当前软件版本号,整数值。例如 160, 256 等。
如果在 Autox.js 中运行则为 Autox.js 的版本号;在打包的软件中则为打包软件的版本号。

app.versionName

  • return {string}

当前软件的版本名称,例如"3.0.0 Beta"。
如果在 Autox.js 中运行则为 Autox.js 的版本名称;在打包的软件中则为打包软件的版本名称。

app.autojs.versionCode

  • return {number}

Autox.js 版本号,整数值。例如 160, 256 等。

app.autojs.versionName

  • return {string}

Autox.js 版本名称,例如"3.0.0 Beta"。

app.launchApp(appName)

global
  • appName {string} 应用名称
  • return {boolean}

通过应用名称启动应用。如果该名称对应的应用不存在,则返回 false; 否则返回 true。如果该名称对应多个应用,则只启动其中某一个。

app.launch(packageName)

global
  • packageName {string} 应用包名
  • return {boolean}

通过应用包名启动应用。如果该包名对应的应用不存在,则返回 false;否则返回 true。

app.launchPackage(packageName)

global
  • packageName {string} 应用包名
  • return {boolean}

相当于app.launch(packageName)

app.getPackageName(appName)

global
  • appName {string} 应用名称
  • return {string}

获取应用名称对应的已安装的应用的包名,如果该找不到该应用,返回 null 。如果该名称对应多个应用,则只返回其中某一个的包名。

app.getAppName(packageName)

global
  • packageName {string} 应用包名
  • return {string}

获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回 null

app.openAppSetting(packageName)

global
  • packageName {string} 应用包名
  • return {boolean}

打开应用的详情页(设置页)。如果找不到该应用,返回 false; 否则返回 true。

app.viewFile(path)

  • path {string} 文件路径

用其他应用查看文件。文件不存在的情况由查看文件的应用处理。

如果找不出可以查看该文件的应用,则抛出ActivityNotException

app.editFile(path)

  • path {string} 文件路径

用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。

如果找不出可以编辑该文件的应用,则抛出ActivityNotException

app.uninstall(packageName)

  • packageName {string} 应用包名

卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。

app.openUrl(url)

  • url {string} 网站的 URL,如果不以 "http://" 或 "https://" 开头则默认是 "http://"。

用浏览器打开网站 url。

如果没有安装浏览器应用,则抛出ActivityNotException

app.sendEmail(options)

  • options {object} 发送邮件的参数。包括:
    • email {string} | {array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示
    • cc {string} | {array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示
    • bcc {string} | {array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示
    • subject {string} 邮件主题(标题)
    • text {string} 邮件正文
    • attachment {string} 附件的路径。

根据选项options调用邮箱应用发送邮件。这些选项均是可选的。

如果没有安装邮箱应用,则抛出ActivityNotException

//发送邮件给10086@qq.com和10001@qq.com。
@@ -70,6 +70,6 @@
   true
 );
 

参见intent 参数的规范open in new window

app.parseUri(uri)

  • uri {string} 一个代表 Uri 的字符串,例如"file:///sdcard/1.txt", "https://www.autojs.org"
  • return {Uri} 一个代表 Uri 的对象,参见android.net.Uriopen in new window

解析 uri 字符串并返回相应的 Uri 对象。即使 Uri 格式错误,该函数也会返回一个 Uri 对象,但之后如果访问该对象的 scheme, path 等值可能因解析失败而返回null

需要注意的是,在高版本 Android 上,由于系统限制直接在 Uri 暴露文件的绝对路径,因此如果 uri 字符串是文件file://...,返回的 Uri 会是诸如content://...的形式。

app.getUriForFile(path)

从一个文件路径创建一个 uri 对象。需要注意的是,在高版本 Android 上,由于系统限制直接在 Uri 暴露文件的绝对路径,因此返回的 Uri 会是诸如content://...的形式。

- + diff --git a/assets/404.html-agKWSmTC.js b/assets/404.html-Bvq10IVt.js similarity index 82% rename from assets/404.html-agKWSmTC.js rename to assets/404.html-Bvq10IVt.js index aabfb92..2c5fdcf 100644 --- a/assets/404.html-agKWSmTC.js +++ b/assets/404.html-Bvq10IVt.js @@ -1 +1 @@ -import{_ as t,o as e,c as o,a}from"./app-CJv-W2Gj.js";const n={},c=a("p",null,"404 Not Found",-1),l=[c];function s(_,r){return e(),o("div",null,l)}const d=t(n,[["render",s],["__file","404.html.vue"]]),h=JSON.parse('{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null}');export{d as comp,h as data}; +import{_ as t,o as e,c as o,a}from"./app-BpvbY-DG.js";const n={},c=a("p",null,"404 Not Found",-1),l=[c];function s(_,r){return e(),o("div",null,l)}const d=t(n,[["render",s],["__file","404.html.vue"]]),h=JSON.parse('{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null}');export{d as comp,h as data}; diff --git a/assets/Tessract.html-gIVxW5e1.js b/assets/Tessract.html-CqES5y4x.js similarity index 93% rename from assets/Tessract.html-gIVxW5e1.js rename to assets/Tessract.html-CqES5y4x.js index c568b85..d3bff4c 100644 --- a/assets/Tessract.html-gIVxW5e1.js +++ b/assets/Tessract.html-CqES5y4x.js @@ -1 +1 @@ -import{_ as c,r as o,o as n,c as i,a as e,b as t,d as a}from"./app-CJv-W2Gj.js";const l={},m={id:"tessract",tabindex:"-1"},d={class:"header-anchor",href:"#tessract"},_={href:"https://github.com/wilinz/autoxjs-tessocr",target:"_blank",rel:"noopener noreferrer"};function p(h,f){const s=o("Badge"),r=o("ExternalLinkIcon");return n(),i("div",null,[e("h1",m,[e("a",d,[e("span",null,[t("Tessract "),a(s,{type:"tip",text:"6.2.9",vertical:"top"}),t(),a(s,{type:"tip",text:"实验",vertical:"middle"})])])]),e("p",null,[t("前往 github 下载完整例子:"),e("a",_,[t("Tessract OCR"),a(r)])])])}const x=c(l,[["render",p],["__file","Tessract.html.vue"]]),T=JSON.parse('{"path":"/Tessract.html","title":"Tessract","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"Tessract.md"}');export{x as comp,T as data}; +import{_ as c,r as o,o as n,c as i,a as e,b as t,d as a}from"./app-BpvbY-DG.js";const l={},m={id:"tessract",tabindex:"-1"},d={class:"header-anchor",href:"#tessract"},_={href:"https://github.com/wilinz/autoxjs-tessocr",target:"_blank",rel:"noopener noreferrer"};function p(h,f){const s=o("Badge"),r=o("ExternalLinkIcon");return n(),i("div",null,[e("h1",m,[e("a",d,[e("span",null,[t("Tessract "),a(s,{type:"tip",text:"6.2.9",vertical:"top"}),t(),a(s,{type:"tip",text:"实验",vertical:"middle"})])])]),e("p",null,[t("前往 github 下载完整例子:"),e("a",_,[t("Tessract OCR"),a(r)])])])}const x=c(l,[["render",p],["__file","Tessract.html.vue"]]),T=JSON.parse('{"path":"/Tessract.html","title":"Tessract","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"Tessract.md"}');export{x as comp,T as data}; diff --git a/assets/app-CJv-W2Gj.js b/assets/app-BpvbY-DG.js similarity index 98% rename from assets/app-CJv-W2Gj.js rename to assets/app-BpvbY-DG.js index c33643f..6cc542a 100644 --- a/assets/app-CJv-W2Gj.js +++ b/assets/app-BpvbY-DG.js @@ -14,7 +14,7 @@ * @vue/runtime-dom v3.4.21 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const lu="http://www.w3.org/2000/svg",au="http://www.w3.org/1998/Math/MathML",Ot=typeof document<"u"?document:null,Hs=Ot&&Ot.createElement("template"),cu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ot.createElementNS(lu,e):t==="mathml"?Ot.createElementNS(au,e):Ot.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ot.createTextNode(e),createComment:e=>Ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Hs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Hs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},At="transition",Cn="animation",Fn=Symbol("_vtc"),er=(e,{slots:t})=>de(mc,uu(e),t);er.displayName="Transition";const wl={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};er.props=Pe({},rl,wl);const Vt=(e,t=[])=>{ee(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ds=e=>e?ee(e)?e.some(t=>t.length>1):e.length>1:!1;function uu(e){const t={};for(const E in e)E in wl||(t[E]=e[E]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,g=fu(o),y=g&&g[0],w=g&&g[1],{onBeforeEnter:T,onEnter:k,onEnterCancelled:v,onLeave:S,onLeaveCancelled:B,onBeforeAppear:I=T,onAppear:H=k,onAppearCancelled:_=v}=t,G=(E,M,te)=>{jt(E,M?u:l),jt(E,M?c:i),te&&te()},L=(E,M)=>{E._isLeaving=!1,jt(E,f),jt(E,m),jt(E,d),M&&M()},U=E=>(M,te)=>{const se=E?H:k,P=()=>G(M,E,te);Vt(se,[M,P]),Bs(()=>{jt(M,E?a:s),Tt(M,E?u:l),Ds(se)||Fs(M,r,y,P)})};return Pe(t,{onBeforeEnter(E){Vt(T,[E]),Tt(E,s),Tt(E,i)},onBeforeAppear(E){Vt(I,[E]),Tt(E,a),Tt(E,c)},onEnter:U(!1),onAppear:U(!0),onLeave(E,M){E._isLeaving=!0;const te=()=>L(E,M);Tt(E,f),pu(),Tt(E,d),Bs(()=>{E._isLeaving&&(jt(E,f),Tt(E,m),Ds(S)||Fs(E,r,w,te))}),Vt(S,[E,te])},onEnterCancelled(E){G(E,!1),Vt(v,[E])},onAppearCancelled(E){G(E,!0),Vt(_,[E])},onLeaveCancelled(E){L(E),Vt(B,[E])}})}function fu(e){if(e==null)return null;if(we(e))return[ro(e.enter),ro(e.leave)];{const t=ro(e);return[t,t]}}function ro(e){return ha(e)}function Tt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Fn]||(e[Fn]=new Set)).add(t)}function jt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Fn];n&&(n.delete(t),n.size||(e[Fn]=void 0))}function Bs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let du=0;function Fs(e,t,n,r){const o=e._endId=++du,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=hu(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=m=>{m.target===e&&++u>=a&&f()};setTimeout(()=>{u(n[g]||"").split(", "),o=r(`${At}Delay`),s=r(`${At}Duration`),i=zs(o,s),l=r(`${Cn}Delay`),a=r(`${Cn}Duration`),c=zs(l,a);let u=null,f=0,d=0;t===At?i>0&&(u=At,f=i,d=s.length):t===Cn?c>0&&(u=Cn,f=c,d=a.length):(f=Math.max(i,c),u=f>0?i>c?At:Cn:null,d=u?u===At?s.length:a.length:0);const m=u===At&&/\b(transform|all)(,|$)/.test(r(`${At}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function zs(e,t){for(;e.lengthVs(n)+Vs(e[r])))}function Vs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function pu(){return document.body.offsetHeight}function mu(e,t,n){const r=e[Fn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Pr=Symbol("_vod"),Cl=Symbol("_vsh"),Or={beforeMount(e,{value:t},{transition:n}){e[Pr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Sn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Sn(e,!0),r.enter(e)):r.leave(e,()=>{Sn(e,!1)}):Sn(e,t))},beforeUnmount(e,{value:t}){Sn(e,t)}};function Sn(e,t){e.style.display=t?e[Pr]:"none",e[Cl]=!t}const gu=Symbol(""),vu=/(^|;)\s*display\s*:/;function _u(e,t,n){const r=e.style,o=ke(n);let s=!1;if(n&&!o){if(t)if(ke(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&br(r,l,"")}else for(const i in t)n[i]==null&&br(r,i,"");for(const i in n)i==="display"&&(s=!0),br(r,i,n[i])}else if(o){if(t!==n){const i=r[gu];i&&(n+=";"+i),r.cssText=n,s=vu.test(n)}}else t&&e.removeAttribute("style");Pr in e&&(e[Pr]=s?r.display:"",e[Cl]&&(r.display="none"))}const js=/\s*!important$/;function br(e,t,n){if(ee(n))n.forEach(r=>br(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=bu(e,t);js.test(n)?e.setProperty(en(r),n.replace(js,""),"important"):e[r]=n}}const Us=["Webkit","Moz","ms"],oo={};function bu(e,t){const n=oo[t];if(n)return n;let r=nt(t);if(r!=="filter"&&r in e)return oo[t]=r;r=qn(r);for(let o=0;oso||(Lu.then(()=>so=0),so=Date.now());function Tu(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;tt(ku(r,n.value),t,5,[r])};return n.value=e,n.attached=Au(),n}function ku(e,t){if(ee(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Gs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ru=(e,t,n,r,o,s,i,l,a)=>{const c=o==="svg";t==="class"?mu(e,r,c):t==="style"?_u(e,n,r):Kn(t)?Io(t)||Su(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Pu(e,t,r,c))?Eu(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),yu(e,t,r,c))};function Pu(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Gs(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Gs(t)&&ke(n)?!1:t in e}const Ou={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Iu=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=en(o.key);if(t.some(i=>i===s||Ou[i]===s))return e(o)})},$u=Pe({patchProp:Ru},cu);let io,Js=!1;function Mu(){return io=Js?io:jc($u),Js=!0,io}const Nu=(...e)=>{const t=Mu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Du(r);if(o)return n(o,!0,Hu(o))},t};function Hu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Du(e){return ke(e)?document.querySelector(e):e}var Bu=["link","meta","script","style","noscript","template"],Fu=["title","base"],zu=([e,t,n])=>Fu.includes(e)?e:Bu.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Vu=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=zu(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},tr=e=>/^(https?:)?\/\//.test(e),Sl=e=>/^[a-z][a-z0-9+.-]*:/.test(e),Xo=e=>Object.prototype.toString.call(e)==="[object Object]",ju=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let r=t.replace(/(^|\/)README.md$/i,"$1index.html");return r.endsWith(".md")?r=r.substring(0,r.length-3)+".html":r.endsWith(".html")||(r=r+".html"),r.endsWith("/index.html")&&(r=r.substring(0,r.length-10)),r+n.join("")},xl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ll=e=>e[0]==="/"?e.slice(1):e,Al=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},dt=e=>typeof e=="string";const Uu="modulepreload",Wu=function(e){return"/1234/"+e},Ys={},le=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=Wu(a),a in Ys)return;Ys[a]=!0;const c=a.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(!!r)for(let m=s.length-1;m>=0;m--){const g=s[m];if(g.href===a&&(!c||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${u}`))return;const d=document.createElement("link");if(d.rel=c?"stylesheet":Uu,c||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),c)return new Promise((m,g)=>{d.addEventListener("load",m),d.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},Ku=JSON.parse("{}"),qu=Object.fromEntries([["/",{loader:()=>le(()=>import("./index.html-QB9UjAb3.js"),[]),meta:{title:""}}],["/Tessract.html",{loader:()=>le(()=>import("./Tessract.html-gIVxW5e1.js"),[]),meta:{title:"Tessract"}}],["/app.html",{loader:()=>le(()=>import("./app.html-CGMDDWAV.js"),[]),meta:{title:"应用交互-app"}}],["/base64.html",{loader:()=>le(()=>import("./base64.html-D55WQS5c.js"),[]),meta:{title:"Base64 编码"}}],["/canvas.html",{loader:()=>le(()=>import("./canvas.html-CgYeu7oG.js"),[]),meta:{title:"Canvas"}}],["/colors.html",{loader:()=>le(()=>import("./colors.html-Ba-a9BbK.js"),[]),meta:{title:"颜色-colors"}}],["/console.html",{loader:()=>le(()=>import("./console.html-NLWchUDA.js"),[]),meta:{title:"控制台-console"}}],["/continuation.html",{loader:()=>le(()=>import("./continuation.html-BVTEm5pa.js"),[]),meta:{title:"协程"}}],["/coordinatesBasedAutomation.html",{loader:()=>le(()=>import("./coordinatesBasedAutomation.html-CTgwQEvC.js"),[]),meta:{title:"automator"}}],["/crypto.html",{loader:()=>le(()=>import("./crypto.html-B0TZyucO.js"),[]),meta:{title:"加密-crypto"}}],["/device.html",{loader:()=>le(()=>import("./device.html-iBdffhA8.js"),[]),meta:{title:"设备信息-device"}}],["/dialogs.html",{loader:()=>le(()=>import("./dialogs.html-DNd01AII.js"),[]),meta:{title:"对话框-dialogs"}}],["/documentation.html",{loader:()=>le(()=>import("./documentation.html-jc2thiJs.js"),[]),meta:{title:"关于本文档"}}],["/engines.html",{loader:()=>le(()=>import("./engines.html-C5r9t3GG.js"),[]),meta:{title:"脚本引擎-engines"}}],["/events.html",{loader:()=>le(()=>import("./events.html-_efPwSo4.js"),[]),meta:{title:"事件与监听-events"}}],["/files.html",{loader:()=>le(()=>import("./files.html-BDQk3btp.js"),[]),meta:{title:"文件系统-files"}}],["/floaty.html",{loader:()=>le(()=>import("./floaty.html-CGwIKUry.js"),[]),meta:{title:"悬浮窗-floaty"}}],["/global.html",{loader:()=>le(()=>import("./global.html-C32Uu0XB.js"),[]),meta:{title:"全局对象-global"}}],["/gmlkit.html",{loader:()=>le(()=>import("./gmlkit.html-DQoPp91-.js"),[]),meta:{title:"ML kit OCR"}}],["/http.html",{loader:()=>le(()=>import("./http.html-6scV030Z.js"),[]),meta:{title:"网络请求-http"}}],["/images.html",{loader:()=>le(()=>import("./images.html-BYFpxzX5.js"),[]),meta:{title:"图色模块-Images"}}],["/keys.html",{loader:()=>le(()=>import("./keys.html-Zrol4FNU.js"),[]),meta:{title:"按键模拟"}}],["/media.html",{loader:()=>le(()=>import("./media.html-pHeOZNzu.js"),[]),meta:{title:"多媒体-media"}}],["/modules.html",{loader:()=>le(()=>import("./modules.html-B_vb7hEQ.js"),[]),meta:{title:"module (模块)"}}],["/overview.html",{loader:()=>le(()=>import("./overview.html-BQPiPwQ8.js"),[]),meta:{title:"综述"}}],["/paddle.html",{loader:()=>le(()=>import("./paddle.html-BOLc6tRD.js"),[]),meta:{title:"paddle"}}],["/qa.html",{loader:()=>le(()=>import("./qa.html-gkdnqAK5.js"),[]),meta:{title:"Q & A"}}],["/shell.html",{loader:()=>le(()=>import("./shell.html-C9mviBbW.js"),[]),meta:{title:"shell 函数"}}],["/storages.html",{loader:()=>le(()=>import("./storages.html-CX52M18A.js"),[]),meta:{title:"Storages"}}],["/threads.html",{loader:()=>le(()=>import("./threads.html-BmvHvO8A.js"),[]),meta:{title:"线程-threads"}}],["/timers.html",{loader:()=>le(()=>import("./timers.html-BSmEQRmN.js"),[]),meta:{title:"Timer - 定时器"}}],["/util.html",{loader:()=>le(()=>import("./util.html-q1x2JiuW.js"),[]),meta:{title:"Util"}}],["/webViewAndHtml.html",{loader:()=>le(()=>import("./webViewAndHtml.html-BWMzcJX2.js"),[]),meta:{title:"WebView 与 HTML"}}],["/websocket.html",{loader:()=>le(()=>import("./websocket.html-6u2APlAF.js"),[]),meta:{title:"websocket"}}],["/widgetsBasedAutomation.html",{loader:()=>le(()=>import("./widgetsBasedAutomation.html-BBmiSycq.js"),[]),meta:{title:"基于控件的操作"}}],["/workWithJava.html",{loader:()=>le(()=>import("./workWithJava.html-JvVIUQ3K.js"),[]),meta:{title:"WorkWithJava"}}],["/zips.html",{loader:()=>le(()=>import("./zips.html-Ctt-EwXk.js"),[]),meta:{title:"压缩与解压"}}],["/404.html",{loader:()=>le(()=>import("./404.html-agKWSmTC.js"),[]),meta:{title:""}}]]);/*! +**/const lu="http://www.w3.org/2000/svg",au="http://www.w3.org/1998/Math/MathML",Ot=typeof document<"u"?document:null,Hs=Ot&&Ot.createElement("template"),cu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ot.createElementNS(lu,e):t==="mathml"?Ot.createElementNS(au,e):Ot.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ot.createTextNode(e),createComment:e=>Ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Hs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Hs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},At="transition",Cn="animation",Fn=Symbol("_vtc"),er=(e,{slots:t})=>de(mc,uu(e),t);er.displayName="Transition";const wl={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};er.props=Pe({},rl,wl);const Vt=(e,t=[])=>{ee(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ds=e=>e?ee(e)?e.some(t=>t.length>1):e.length>1:!1;function uu(e){const t={};for(const E in e)E in wl||(t[E]=e[E]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,g=fu(o),y=g&&g[0],w=g&&g[1],{onBeforeEnter:T,onEnter:k,onEnterCancelled:v,onLeave:S,onLeaveCancelled:B,onBeforeAppear:I=T,onAppear:H=k,onAppearCancelled:_=v}=t,G=(E,M,te)=>{jt(E,M?u:l),jt(E,M?c:i),te&&te()},L=(E,M)=>{E._isLeaving=!1,jt(E,f),jt(E,m),jt(E,d),M&&M()},U=E=>(M,te)=>{const se=E?H:k,P=()=>G(M,E,te);Vt(se,[M,P]),Bs(()=>{jt(M,E?a:s),Tt(M,E?u:l),Ds(se)||Fs(M,r,y,P)})};return Pe(t,{onBeforeEnter(E){Vt(T,[E]),Tt(E,s),Tt(E,i)},onBeforeAppear(E){Vt(I,[E]),Tt(E,a),Tt(E,c)},onEnter:U(!1),onAppear:U(!0),onLeave(E,M){E._isLeaving=!0;const te=()=>L(E,M);Tt(E,f),pu(),Tt(E,d),Bs(()=>{E._isLeaving&&(jt(E,f),Tt(E,m),Ds(S)||Fs(E,r,w,te))}),Vt(S,[E,te])},onEnterCancelled(E){G(E,!1),Vt(v,[E])},onAppearCancelled(E){G(E,!0),Vt(_,[E])},onLeaveCancelled(E){L(E),Vt(B,[E])}})}function fu(e){if(e==null)return null;if(we(e))return[ro(e.enter),ro(e.leave)];{const t=ro(e);return[t,t]}}function ro(e){return ha(e)}function Tt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Fn]||(e[Fn]=new Set)).add(t)}function jt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Fn];n&&(n.delete(t),n.size||(e[Fn]=void 0))}function Bs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let du=0;function Fs(e,t,n,r){const o=e._endId=++du,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=hu(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=m=>{m.target===e&&++u>=a&&f()};setTimeout(()=>{u(n[g]||"").split(", "),o=r(`${At}Delay`),s=r(`${At}Duration`),i=zs(o,s),l=r(`${Cn}Delay`),a=r(`${Cn}Duration`),c=zs(l,a);let u=null,f=0,d=0;t===At?i>0&&(u=At,f=i,d=s.length):t===Cn?c>0&&(u=Cn,f=c,d=a.length):(f=Math.max(i,c),u=f>0?i>c?At:Cn:null,d=u?u===At?s.length:a.length:0);const m=u===At&&/\b(transform|all)(,|$)/.test(r(`${At}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function zs(e,t){for(;e.lengthVs(n)+Vs(e[r])))}function Vs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function pu(){return document.body.offsetHeight}function mu(e,t,n){const r=e[Fn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Pr=Symbol("_vod"),Cl=Symbol("_vsh"),Or={beforeMount(e,{value:t},{transition:n}){e[Pr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Sn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Sn(e,!0),r.enter(e)):r.leave(e,()=>{Sn(e,!1)}):Sn(e,t))},beforeUnmount(e,{value:t}){Sn(e,t)}};function Sn(e,t){e.style.display=t?e[Pr]:"none",e[Cl]=!t}const gu=Symbol(""),vu=/(^|;)\s*display\s*:/;function _u(e,t,n){const r=e.style,o=ke(n);let s=!1;if(n&&!o){if(t)if(ke(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&br(r,l,"")}else for(const i in t)n[i]==null&&br(r,i,"");for(const i in n)i==="display"&&(s=!0),br(r,i,n[i])}else if(o){if(t!==n){const i=r[gu];i&&(n+=";"+i),r.cssText=n,s=vu.test(n)}}else t&&e.removeAttribute("style");Pr in e&&(e[Pr]=s?r.display:"",e[Cl]&&(r.display="none"))}const js=/\s*!important$/;function br(e,t,n){if(ee(n))n.forEach(r=>br(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=bu(e,t);js.test(n)?e.setProperty(en(r),n.replace(js,""),"important"):e[r]=n}}const Us=["Webkit","Moz","ms"],oo={};function bu(e,t){const n=oo[t];if(n)return n;let r=nt(t);if(r!=="filter"&&r in e)return oo[t]=r;r=qn(r);for(let o=0;oso||(Lu.then(()=>so=0),so=Date.now());function Tu(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;tt(ku(r,n.value),t,5,[r])};return n.value=e,n.attached=Au(),n}function ku(e,t){if(ee(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Gs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ru=(e,t,n,r,o,s,i,l,a)=>{const c=o==="svg";t==="class"?mu(e,r,c):t==="style"?_u(e,n,r):Kn(t)?Io(t)||Su(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Pu(e,t,r,c))?Eu(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),yu(e,t,r,c))};function Pu(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Gs(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Gs(t)&&ke(n)?!1:t in e}const Ou={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Iu=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=en(o.key);if(t.some(i=>i===s||Ou[i]===s))return e(o)})},$u=Pe({patchProp:Ru},cu);let io,Js=!1;function Mu(){return io=Js?io:jc($u),Js=!0,io}const Nu=(...e)=>{const t=Mu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Du(r);if(o)return n(o,!0,Hu(o))},t};function Hu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Du(e){return ke(e)?document.querySelector(e):e}var Bu=["link","meta","script","style","noscript","template"],Fu=["title","base"],zu=([e,t,n])=>Fu.includes(e)?e:Bu.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,Vu=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=zu(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},tr=e=>/^(https?:)?\/\//.test(e),Sl=e=>/^[a-z][a-z0-9+.-]*:/.test(e),Xo=e=>Object.prototype.toString.call(e)==="[object Object]",ju=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let r=t.replace(/(^|\/)README.md$/i,"$1index.html");return r.endsWith(".md")?r=r.substring(0,r.length-3)+".html":r.endsWith(".html")||(r=r+".html"),r.endsWith("/index.html")&&(r=r.substring(0,r.length-10)),r+n.join("")},xl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ll=e=>e[0]==="/"?e.slice(1):e,Al=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},dt=e=>typeof e=="string";const Uu="modulepreload",Wu=function(e){return"/1234/"+e},Ys={},le=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=Wu(a),a in Ys)return;Ys[a]=!0;const c=a.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(!!r)for(let m=s.length-1;m>=0;m--){const g=s[m];if(g.href===a&&(!c||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${u}`))return;const d=document.createElement("link");if(d.rel=c?"stylesheet":Uu,c||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),c)return new Promise((m,g)=>{d.addEventListener("load",m),d.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},Ku=JSON.parse("{}"),qu=Object.fromEntries([["/",{loader:()=>le(()=>import("./index.html-Cua4YK9l.js"),[]),meta:{title:""}}],["/Tessract.html",{loader:()=>le(()=>import("./Tessract.html-CqES5y4x.js"),[]),meta:{title:"Tessract"}}],["/app.html",{loader:()=>le(()=>import("./app.html-JLWdM1OD.js"),[]),meta:{title:"应用交互-app"}}],["/base64.html",{loader:()=>le(()=>import("./base64.html-Bs2Qsqlm.js"),[]),meta:{title:"Base64 编码"}}],["/canvas.html",{loader:()=>le(()=>import("./canvas.html-BfpBTCsU.js"),[]),meta:{title:"Canvas"}}],["/colors.html",{loader:()=>le(()=>import("./colors.html-BcT9f5xE.js"),[]),meta:{title:"颜色-colors"}}],["/console.html",{loader:()=>le(()=>import("./console.html-CUwmR5SZ.js"),[]),meta:{title:"控制台-console"}}],["/continuation.html",{loader:()=>le(()=>import("./continuation.html-BDkg2Zig.js"),[]),meta:{title:"协程"}}],["/coordinatesBasedAutomation.html",{loader:()=>le(()=>import("./coordinatesBasedAutomation.html-DWGHa3yy.js"),[]),meta:{title:"automator"}}],["/crypto.html",{loader:()=>le(()=>import("./crypto.html-oTPtLjbB.js"),[]),meta:{title:"加密-crypto"}}],["/device.html",{loader:()=>le(()=>import("./device.html-PWFBXTZH.js"),[]),meta:{title:"设备信息-device"}}],["/dialogs.html",{loader:()=>le(()=>import("./dialogs.html-vpK5itU1.js"),[]),meta:{title:"对话框-dialogs"}}],["/documentation.html",{loader:()=>le(()=>import("./documentation.html-fn9sC5UJ.js"),[]),meta:{title:"关于本文档"}}],["/engines.html",{loader:()=>le(()=>import("./engines.html-DM4PY1Q3.js"),[]),meta:{title:"脚本引擎-engines"}}],["/events.html",{loader:()=>le(()=>import("./events.html-CGm_tQ3C.js"),[]),meta:{title:"事件与监听-events"}}],["/files.html",{loader:()=>le(()=>import("./files.html-BygZEfOk.js"),[]),meta:{title:"文件系统-files"}}],["/floaty.html",{loader:()=>le(()=>import("./floaty.html-C80y_NbK.js"),[]),meta:{title:"悬浮窗-floaty"}}],["/global.html",{loader:()=>le(()=>import("./global.html-BMQDCODx.js"),[]),meta:{title:"全局对象-global"}}],["/gmlkit.html",{loader:()=>le(()=>import("./gmlkit.html-Ureqrfme.js"),[]),meta:{title:"ML kit OCR"}}],["/http.html",{loader:()=>le(()=>import("./http.html-BnJ2uyXo.js"),[]),meta:{title:"网络请求-http"}}],["/images.html",{loader:()=>le(()=>import("./images.html-DqwCdaN6.js"),[]),meta:{title:"图色模块-Images"}}],["/keys.html",{loader:()=>le(()=>import("./keys.html-BMCtxNJF.js"),[]),meta:{title:"按键模拟"}}],["/media.html",{loader:()=>le(()=>import("./media.html-Fq-NVCP1.js"),[]),meta:{title:"多媒体-media"}}],["/modules.html",{loader:()=>le(()=>import("./modules.html-A8eJVWCy.js"),[]),meta:{title:"module (模块)"}}],["/overview.html",{loader:()=>le(()=>import("./overview.html-BVY4G8sO.js"),[]),meta:{title:"综述"}}],["/paddle.html",{loader:()=>le(()=>import("./paddle.html-1F2D6lyd.js"),[]),meta:{title:"paddle"}}],["/qa.html",{loader:()=>le(()=>import("./qa.html-D8huPY4F.js"),[]),meta:{title:"Q & A"}}],["/shell.html",{loader:()=>le(()=>import("./shell.html-CxaMeQ7b.js"),[]),meta:{title:"shell 函数"}}],["/storages.html",{loader:()=>le(()=>import("./storages.html-CPyYyGdl.js"),[]),meta:{title:"Storages"}}],["/threads.html",{loader:()=>le(()=>import("./threads.html-CqgBgLf8.js"),[]),meta:{title:"线程-threads"}}],["/timers.html",{loader:()=>le(()=>import("./timers.html-BQHCdCJv.js"),[]),meta:{title:"Timer - 定时器"}}],["/util.html",{loader:()=>le(()=>import("./util.html-Bm6Y_sH1.js"),[]),meta:{title:"Util"}}],["/webViewAndHtml.html",{loader:()=>le(()=>import("./webViewAndHtml.html-Dl_9qlIB.js"),[]),meta:{title:"WebView 与 HTML"}}],["/websocket.html",{loader:()=>le(()=>import("./websocket.html-fhDf6v-S.js"),[]),meta:{title:"websocket"}}],["/widgetsBasedAutomation.html",{loader:()=>le(()=>import("./widgetsBasedAutomation.html-C8jiG5xu.js"),[]),meta:{title:"基于控件的操作"}}],["/workWithJava.html",{loader:()=>le(()=>import("./workWithJava.html-QgyDNgzs.js"),[]),meta:{title:"WorkWithJava"}}],["/zips.html",{loader:()=>le(()=>import("./zips.html-BE-3dQnm.js"),[]),meta:{title:"压缩与解压"}}],["/404.html",{loader:()=>le(()=>import("./404.html-Bvq10IVt.js"),[]),meta:{title:""}}]]);/*! * vue-router v4.3.0 * (c) 2024 Eduardo San Martin Morote * @license MIT diff --git a/assets/app.html-CGMDDWAV.js b/assets/app.html-JLWdM1OD.js similarity index 99% rename from assets/app.html-CGMDDWAV.js rename to assets/app.html-JLWdM1OD.js index ff3e75d..937e7c0 100644 --- a/assets/app.html-CGMDDWAV.js +++ b/assets/app.html-JLWdM1OD.js @@ -1,4 +1,4 @@ -import{_ as i,r as o,o as l,c,d as e,a,b as n,e as p}from"./app-CJv-W2Gj.js";const r={},d=a("h1",{id:"应用交互-app",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#应用交互-app"},[a("span",null,"应用交互-app")])],-1),u=p('

app

该模块允许你与其他应用程序进行交互。你可以启动其他应用程序,发送 Intent 意图,打开文件,发送电子邮件等。

app.versionCode

  • return {number}

当前软件版本号,整数值。例如 160, 256 等。
如果在 Autox.js 中运行则为 Autox.js 的版本号;在打包的软件中则为打包软件的版本号。

app.versionName

  • return {string}

当前软件的版本名称,例如"3.0.0 Beta"。
如果在 Autox.js 中运行则为 Autox.js 的版本名称;在打包的软件中则为打包软件的版本名称。

app.autojs.versionCode

  • return {number}

Autox.js 版本号,整数值。例如 160, 256 等。

app.autojs.versionName

  • return {string}

Autox.js 版本名称,例如"3.0.0 Beta"。

app.launchApp(appName)

',14),h=a("ul",null,[a("li",null,[a("code",null,"appName"),n(" {string} 应用名称")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),v=a("p",null,"通过应用名称启动应用。如果该名称对应的应用不存在,则返回 false; 否则返回 true。如果该名称对应多个应用,则只启动其中某一个。",-1),k=a("h2",{id:"app-launch-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-launch-packagename"},[a("span",null,"app.launch(packageName)")])],-1),m=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),g=a("p",null,"通过应用包名启动应用。如果该包名对应的应用不存在,则返回 false;否则返回 true。",-1),_=a("h2",{id:"app-launchpackage-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-launchpackage-packagename"},[a("span",null,"app.launchPackage(packageName)")])],-1),b=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),y=a("p",null,[n("相当于"),a("code",null,"app.launch(packageName)"),n("。")],-1),f=a("h2",{id:"app-getpackagename-appname",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-getpackagename-appname"},[a("span",null,"app.getPackageName(appName)")])],-1),x=a("ul",null,[a("li",null,[a("code",null,"appName"),n(" {string} 应用名称")]),a("li",null,[a("code",null,"return"),n(" {string}")])],-1),q=a("p",null,[n("获取应用名称对应的已安装的应用的包名,如果该找不到该应用,返回 "),a("code",null,"null"),n(" 。如果该名称对应多个应用,则只返回其中某一个的包名。")],-1),j=a("h2",{id:"app-getappname-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-getappname-packagename"},[a("span",null,"app.getAppName(packageName)")])],-1),A=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {string}")])],-1),N=a("p",null,[n("获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回 "),a("code",null,"null"),n("。")],-1),I=a("h2",{id:"app-openappsetting-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-openappsetting-packagename"},[a("span",null,"app.openAppSetting(packageName)")])],-1),U=p(`
  • packageName {string} 应用包名
  • return {boolean}

打开应用的详情页(设置页)。如果找不到该应用,返回 false; 否则返回 true。

app.viewFile(path)

  • path {string} 文件路径

用其他应用查看文件。文件不存在的情况由查看文件的应用处理。

如果找不出可以查看该文件的应用,则抛出ActivityNotException

app.editFile(path)

  • path {string} 文件路径

用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。

如果找不出可以编辑该文件的应用,则抛出ActivityNotException

app.uninstall(packageName)

  • packageName {string} 应用包名

卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。

app.openUrl(url)

  • url {string} 网站的 URL,如果不以 "http://" 或 "https://" 开头则默认是 "http://"。

用浏览器打开网站 url。

如果没有安装浏览器应用,则抛出ActivityNotException

app.sendEmail(options)

  • options {object} 发送邮件的参数。包括:
    • email {string} | {array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示
    • cc {string} | {array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示
    • bcc {string} | {array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示
    • subject {string} 邮件主题(标题)
    • text {string} 邮件正文
    • attachment {string} 附件的路径。

根据选项options调用邮箱应用发送邮件。这些选项均是可选的。

如果没有安装邮箱应用,则抛出ActivityNotException

//发送邮件给10086@qq.com和10001@qq.com。
+import{_ as i,r as o,o as l,c,d as e,a,b as n,e as p}from"./app-BpvbY-DG.js";const r={},d=a("h1",{id:"应用交互-app",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#应用交互-app"},[a("span",null,"应用交互-app")])],-1),u=p('

app

该模块允许你与其他应用程序进行交互。你可以启动其他应用程序,发送 Intent 意图,打开文件,发送电子邮件等。

app.versionCode

  • return {number}

当前软件版本号,整数值。例如 160, 256 等。
如果在 Autox.js 中运行则为 Autox.js 的版本号;在打包的软件中则为打包软件的版本号。

app.versionName

  • return {string}

当前软件的版本名称,例如"3.0.0 Beta"。
如果在 Autox.js 中运行则为 Autox.js 的版本名称;在打包的软件中则为打包软件的版本名称。

app.autojs.versionCode

  • return {number}

Autox.js 版本号,整数值。例如 160, 256 等。

app.autojs.versionName

  • return {string}

Autox.js 版本名称,例如"3.0.0 Beta"。

app.launchApp(appName)

',14),h=a("ul",null,[a("li",null,[a("code",null,"appName"),n(" {string} 应用名称")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),v=a("p",null,"通过应用名称启动应用。如果该名称对应的应用不存在,则返回 false; 否则返回 true。如果该名称对应多个应用,则只启动其中某一个。",-1),k=a("h2",{id:"app-launch-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-launch-packagename"},[a("span",null,"app.launch(packageName)")])],-1),m=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),g=a("p",null,"通过应用包名启动应用。如果该包名对应的应用不存在,则返回 false;否则返回 true。",-1),_=a("h2",{id:"app-launchpackage-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-launchpackage-packagename"},[a("span",null,"app.launchPackage(packageName)")])],-1),b=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {boolean}")])],-1),y=a("p",null,[n("相当于"),a("code",null,"app.launch(packageName)"),n("。")],-1),f=a("h2",{id:"app-getpackagename-appname",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-getpackagename-appname"},[a("span",null,"app.getPackageName(appName)")])],-1),x=a("ul",null,[a("li",null,[a("code",null,"appName"),n(" {string} 应用名称")]),a("li",null,[a("code",null,"return"),n(" {string}")])],-1),q=a("p",null,[n("获取应用名称对应的已安装的应用的包名,如果该找不到该应用,返回 "),a("code",null,"null"),n(" 。如果该名称对应多个应用,则只返回其中某一个的包名。")],-1),j=a("h2",{id:"app-getappname-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-getappname-packagename"},[a("span",null,"app.getAppName(packageName)")])],-1),A=a("ul",null,[a("li",null,[a("code",null,"packageName"),n(" {string} 应用包名")]),a("li",null,[a("code",null,"return"),n(" {string}")])],-1),N=a("p",null,[n("获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回 "),a("code",null,"null"),n("。")],-1),I=a("h2",{id:"app-openappsetting-packagename",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#app-openappsetting-packagename"},[a("span",null,"app.openAppSetting(packageName)")])],-1),U=p(`
  • packageName {string} 应用包名
  • return {boolean}

打开应用的详情页(设置页)。如果找不到该应用,返回 false; 否则返回 true。

app.viewFile(path)

  • path {string} 文件路径

用其他应用查看文件。文件不存在的情况由查看文件的应用处理。

如果找不出可以查看该文件的应用,则抛出ActivityNotException

app.editFile(path)

  • path {string} 文件路径

用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。

如果找不出可以编辑该文件的应用,则抛出ActivityNotException

app.uninstall(packageName)

  • packageName {string} 应用包名

卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。

app.openUrl(url)

  • url {string} 网站的 URL,如果不以 "http://" 或 "https://" 开头则默认是 "http://"。

用浏览器打开网站 url。

如果没有安装浏览器应用,则抛出ActivityNotException

app.sendEmail(options)

  • options {object} 发送邮件的参数。包括:
    • email {string} | {array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示
    • cc {string} | {array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示
    • bcc {string} | {array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示
    • subject {string} 邮件主题(标题)
    • text {string} 邮件正文
    • attachment {string} 附件的路径。

根据选项options调用邮箱应用发送邮件。这些选项均是可选的。

如果没有安装邮箱应用,则抛出ActivityNotException

//发送邮件给10086@qq.com和10001@qq.com。
 app.sendEmail({
   email: ["10086@qq.com", "10001@qq.com"],
   subject: "这是一个邮件标题",
diff --git a/assets/base64.html-D55WQS5c.js b/assets/base64.html-Bs2Qsqlm.js
similarity index 96%
rename from assets/base64.html-D55WQS5c.js
rename to assets/base64.html-Bs2Qsqlm.js
index 8ea8af7..da918c3 100644
--- a/assets/base64.html-D55WQS5c.js
+++ b/assets/base64.html-Bs2Qsqlm.js
@@ -1,4 +1,4 @@
-import{_ as s,r as a,o as t,c,d as o,a as e,e as i}from"./app-CJv-W2Gj.js";const d={},l=e("h1",{id:"base64-编码",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#base64-编码"},[e("span",null,"Base64 编码")])],-1),p=i(`

提供基本的 Base64 转换函数。

$base64.encode(str[, encoding = 'utf-8'])

  • str {string} 要编码的字符串
  • encoding {string} 可选,字符编码

将字符串使用 Base64 编码并返回编码后的字符串。

log($base64.encode("autox.js"));
+import{_ as s,r as a,o as t,c,d as o,a as e,e as i}from"./app-BpvbY-DG.js";const d={},l=e("h1",{id:"base64-编码",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#base64-编码"},[e("span",null,"Base64 编码")])],-1),p=i(`

提供基本的 Base64 转换函数。

$base64.encode(str[, encoding = 'utf-8'])

  • str {string} 要编码的字符串
  • encoding {string} 可选,字符编码

将字符串使用 Base64 编码并返回编码后的字符串。

log($base64.encode("autox.js"));
 // 日志输出 YXV0b3guanM=
 

$base64.decode(str[, encoding = 'utf-8'])

  • str {string} 要解码的字符串
  • encoding {string} 可选,字符编码

将字符串使用 Base64 解码并返回解码后的字符串。

log($base64.decode("YXV0b3guanM="));
 // 日志输出 autox.js
diff --git a/assets/canvas.html-CgYeu7oG.js b/assets/canvas.html-BfpBTCsU.js
similarity index 99%
rename from assets/canvas.html-CgYeu7oG.js
rename to assets/canvas.html-BfpBTCsU.js
index b1fef87..0cf8d64 100644
--- a/assets/canvas.html-CgYeu7oG.js
+++ b/assets/canvas.html-BfpBTCsU.js
@@ -1,4 +1,4 @@
-import{_ as n,o as a,c as s,e as t}from"./app-CJv-W2Gj.js";const p={},c=t(`

Canvas

canvas 提供了使用画布进行 2D 画图的支持,可用于简单的小游戏开发或者图片编辑。使用 canvas 可以轻松地在一张图片或一个界面上绘制各种线与图形。

canvas 的坐标系为平面直角坐标系,以屏幕左上角为原点,屏幕上边为 x 轴正方向,屏幕左边为 y 轴正方向。例如分辨率为 1920*1080 的屏幕上,画一条从屏幕左上角到屏幕右下角的线段为:

canvas.drawLine(0, 0, 1080, 1920, paint);
+import{_ as n,o as a,c as s,e as t}from"./app-BpvbY-DG.js";const p={},c=t(`

Canvas

canvas 提供了使用画布进行 2D 画图的支持,可用于简单的小游戏开发或者图片编辑。使用 canvas 可以轻松地在一张图片或一个界面上绘制各种线与图形。

canvas 的坐标系为平面直角坐标系,以屏幕左上角为原点,屏幕上边为 x 轴正方向,屏幕左边为 y 轴正方向。例如分辨率为 1920*1080 的屏幕上,画一条从屏幕左上角到屏幕右下角的线段为:

canvas.drawLine(0, 0, 1080, 1920, paint);
 

canvas 的绘制依赖于画笔 Paint, 通过设置画笔的粗细、颜色、填充等可以改变绘制出来的图形。例如绘制一个红色实心正方形为:

var paint = new Paint();
 //设置画笔为填充,则绘制出来的图形都是实心的
 paint.setStyle(Paint.STYLE.FILL);
diff --git a/assets/colors.html-Ba-a9BbK.js b/assets/colors.html-BcT9f5xE.js
similarity index 99%
rename from assets/colors.html-Ba-a9BbK.js
rename to assets/colors.html-BcT9f5xE.js
index 78033fc..fdc6c3d 100644
--- a/assets/colors.html-Ba-a9BbK.js
+++ b/assets/colors.html-BcT9f5xE.js
@@ -1,3 +1,3 @@
-import{_ as n,r,o as t,c as i,d as e,a as o,b as l,e as s}from"./app-CJv-W2Gj.js";const d={},h=o("h1",{id:"颜色-colors",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#颜色-colors"},[o("span",null,"颜色-colors")])],-1),p=s('

在 Auto.js 有两种方式表示一个颜色。 一种是使用一个字符串"#AARRGGBB"或"#RRGGBB",其中 AA 是 Alpha 通道(透明度)的值,RR 是 R 通道(红色)的值,GG 是 G 通道(绿色)的值,BB 是 B 通道(蓝色)的值。例如"#ffffff"表示白色, "#7F000000"表示半透明的黑色。 另一种是使用一个 16 进制的"32 位整数" 0xAARRGGBB 来表示一个颜色,例如 0xFF112233表示颜色"#112233", 0x11223344表示颜色"#11223344"。 可以通过colors.toString()把颜色整数转换为字符串,通过colors.parseColor()把颜色字符串解析为颜色整数。

colors.toString(color)

  • color {number} 整数 RGB 颜色值
  • 返回 {string}

返回颜色值的字符串,格式为 "#AARRGGBB"。

colors.red(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 R 通道的值,范围 0~255.

colors.green(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 G 通道的值,范围 0~255.

colors.blue(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 B 通道的值,范围 0~255.

colors.alpha(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 Alpha 通道的值,范围 0~255.

colors.rgb(red, green, blue)

  • red {number} 颜色的 R 通道的值
  • blue {number} 颜色的 G 通道的值
  • green {number} 颜色的 B 通道的值
  • 返回 {number}

返回这些颜色通道构成的整数颜色值。Alpha 通道将是 255(不透明)。

colors.argb(alpha, red, green, blue)

  • alpha {number} 颜色的 Alpha 通道的值
  • red {number} 颜色的 R 通道的值
  • green {number} 颜色的 G 通道的值
  • blue {number} 颜色的 B 通道的值
  • 返回 {number}

返回这些颜色通道构成的整数颜色值。

colors.parseColor(colorStr)

  • colorStr {string} 表示颜色的字符串,例如"#112233"
  • 返回 {number}

返回颜色的整数值。

colors.isSimilar(color2, color2[, threshold, algorithm])

',26),u=o("li",null,[o("code",null,"color1"),l(" {number} | {string} 颜色值 1")],-1),g=o("li",null,[o("code",null,"color1"),l(" {number} | {string} 颜色值 2")],-1),b=o("li",null,[o("code",null,"threshold"),l(" {number} 颜色相似度临界值,默认为 4。取值范围为 0~255。这个值越大表示允许的相似程度越小,如果这个值为 0,则两个颜色相等时该函数才会返回 true。")],-1),m=o("code",null,"algorithm",-1),k=o("li",null,[o("code",null,"diff"),l(": 差值匹配。与给定颜色的 R、G、B 差的绝对值之和小于 threshold 时匹配。")],-1),f=o("li",null,[o("code",null,"rgb"),l(": rgb 欧拉距离相似度。与给定颜色 color 的 rgb 欧拉距离小于等于 threshold 时匹配。")],-1),F=o("code",null,"rgb+",-1),_={href:"https://en.wikipedia.org/wiki/Color_difference",target:"_blank",rel:"noopener noreferrer"},v=o("li",null,[o("code",null,"hs"),l(": hs 欧拉距离匹配。hs 为 HSV 空间的色调值。")],-1),x=o("li",null,"返回 {Boolean}",-1),A=s(`

返回两个颜色是否相似。

colors.equals(color1, color2)

  • color1 {number} | {string} 颜色值 1
  • color1 {number} | {string} 颜色值 2
  • 返回 {Boolean}

返回两个颜色是否相等。注意该函数会忽略 Alpha 通道的值进行比较

log(colors.equals("#112233", "#112234"));
+import{_ as n,r,o as t,c as i,d as e,a as o,b as l,e as s}from"./app-BpvbY-DG.js";const d={},h=o("h1",{id:"颜色-colors",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#颜色-colors"},[o("span",null,"颜色-colors")])],-1),p=s('

在 Auto.js 有两种方式表示一个颜色。 一种是使用一个字符串"#AARRGGBB"或"#RRGGBB",其中 AA 是 Alpha 通道(透明度)的值,RR 是 R 通道(红色)的值,GG 是 G 通道(绿色)的值,BB 是 B 通道(蓝色)的值。例如"#ffffff"表示白色, "#7F000000"表示半透明的黑色。 另一种是使用一个 16 进制的"32 位整数" 0xAARRGGBB 来表示一个颜色,例如 0xFF112233表示颜色"#112233", 0x11223344表示颜色"#11223344"。 可以通过colors.toString()把颜色整数转换为字符串,通过colors.parseColor()把颜色字符串解析为颜色整数。

colors.toString(color)

  • color {number} 整数 RGB 颜色值
  • 返回 {string}

返回颜色值的字符串,格式为 "#AARRGGBB"。

colors.red(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 R 通道的值,范围 0~255.

colors.green(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 G 通道的值,范围 0~255.

colors.blue(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 B 通道的值,范围 0~255.

colors.alpha(color)

  • color {number} | {string} 颜色值
  • 返回 {number}

返回颜色 color 的 Alpha 通道的值,范围 0~255.

colors.rgb(red, green, blue)

  • red {number} 颜色的 R 通道的值
  • blue {number} 颜色的 G 通道的值
  • green {number} 颜色的 B 通道的值
  • 返回 {number}

返回这些颜色通道构成的整数颜色值。Alpha 通道将是 255(不透明)。

colors.argb(alpha, red, green, blue)

  • alpha {number} 颜色的 Alpha 通道的值
  • red {number} 颜色的 R 通道的值
  • green {number} 颜色的 G 通道的值
  • blue {number} 颜色的 B 通道的值
  • 返回 {number}

返回这些颜色通道构成的整数颜色值。

colors.parseColor(colorStr)

  • colorStr {string} 表示颜色的字符串,例如"#112233"
  • 返回 {number}

返回颜色的整数值。

colors.isSimilar(color2, color2[, threshold, algorithm])

',26),u=o("li",null,[o("code",null,"color1"),l(" {number} | {string} 颜色值 1")],-1),g=o("li",null,[o("code",null,"color1"),l(" {number} | {string} 颜色值 2")],-1),b=o("li",null,[o("code",null,"threshold"),l(" {number} 颜色相似度临界值,默认为 4。取值范围为 0~255。这个值越大表示允许的相似程度越小,如果这个值为 0,则两个颜色相等时该函数才会返回 true。")],-1),m=o("code",null,"algorithm",-1),k=o("li",null,[o("code",null,"diff"),l(": 差值匹配。与给定颜色的 R、G、B 差的绝对值之和小于 threshold 时匹配。")],-1),f=o("li",null,[o("code",null,"rgb"),l(": rgb 欧拉距离相似度。与给定颜色 color 的 rgb 欧拉距离小于等于 threshold 时匹配。")],-1),F=o("code",null,"rgb+",-1),_={href:"https://en.wikipedia.org/wiki/Color_difference",target:"_blank",rel:"noopener noreferrer"},v=o("li",null,[o("code",null,"hs"),l(": hs 欧拉距离匹配。hs 为 HSV 空间的色调值。")],-1),x=o("li",null,"返回 {Boolean}",-1),A=s(`

返回两个颜色是否相似。

colors.equals(color1, color2)

  • color1 {number} | {string} 颜色值 1
  • color1 {number} | {string} 颜色值 2
  • 返回 {Boolean}

返回两个颜色是否相等。注意该函数会忽略 Alpha 通道的值进行比较

log(colors.equals("#112233", "#112234"));
 log(colors.equals(0xff112233, 0xff223344));
 

colors.BLACK

黑色,颜色值 #FF000000

colors.DKGRAY

深灰色,颜色值 #FF444444

colors.GRAY

灰色,颜色值 #FF888888

colors.LTGRAY

亮灰色,颜色值 #FFCCCCCC

colors.WHITE

白色,颜色值 #FFFFFFFF

colors.RED

红色,颜色值 #FFFF0000

colors.GREEN

绿色,颜色值 #FF00FF00

colors.BLUE

蓝色,颜色值 #FF0000FF

colors.YELLOW

黄色,颜色值 #FFFFFF00

colors.CYAN

青色,颜色值 #FF00FFFF

colors.MAGENTA

品红色,颜色值 #FFFF00FF

colors.TRANSPARENT

透明,颜色值 #00000000

`,29);function R(q,B){const c=r("Badge"),a=r("ExternalLinkIcon");return t(),i("div",null,[h,e(c,{type:"tip",text:"稳定",vertical:"middle"}),p,o("ul",null,[u,g,b,o("li",null,[m,l(' {string} 颜色匹配算法,默认为"diff", 包括: '),o("ul",null,[k,f,o("li",null,[F,l(": 加权 rgb 欧拉距离匹配("),o("a",_,[l("LAB Delta E"),e(a)]),l(")。")]),v])]),x]),A])}const y=n(d,[["render",R],["__file","colors.html.vue"]]),E=JSON.parse('{"path":"/colors.html","title":"颜色-colors","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"colors.toString(color)","slug":"colors-tostring-color","link":"#colors-tostring-color","children":[]},{"level":2,"title":"colors.red(color)","slug":"colors-red-color","link":"#colors-red-color","children":[]},{"level":2,"title":"colors.green(color)","slug":"colors-green-color","link":"#colors-green-color","children":[]},{"level":2,"title":"colors.blue(color)","slug":"colors-blue-color","link":"#colors-blue-color","children":[]},{"level":2,"title":"colors.alpha(color)","slug":"colors-alpha-color","link":"#colors-alpha-color","children":[]},{"level":2,"title":"colors.rgb(red, green, blue)","slug":"colors-rgb-red-green-blue","link":"#colors-rgb-red-green-blue","children":[]},{"level":2,"title":"colors.argb(alpha, red, green, blue)","slug":"colors-argb-alpha-red-green-blue","link":"#colors-argb-alpha-red-green-blue","children":[]},{"level":2,"title":"colors.parseColor(colorStr)","slug":"colors-parsecolor-colorstr","link":"#colors-parsecolor-colorstr","children":[]},{"level":2,"title":"colors.isSimilar(color2, color2[, threshold, algorithm])","slug":"colors-issimilar-color2-color2-threshold-algorithm","link":"#colors-issimilar-color2-color2-threshold-algorithm","children":[]},{"level":2,"title":"colors.equals(color1, color2)","slug":"colors-equals-color1-color2","link":"#colors-equals-color1-color2","children":[]},{"level":2,"title":"colors.BLACK","slug":"colors-black","link":"#colors-black","children":[]},{"level":2,"title":"colors.DKGRAY","slug":"colors-dkgray","link":"#colors-dkgray","children":[]},{"level":2,"title":"colors.GRAY","slug":"colors-gray","link":"#colors-gray","children":[]},{"level":2,"title":"colors.LTGRAY","slug":"colors-ltgray","link":"#colors-ltgray","children":[]},{"level":2,"title":"colors.WHITE","slug":"colors-white","link":"#colors-white","children":[]},{"level":2,"title":"colors.RED","slug":"colors-red","link":"#colors-red","children":[]},{"level":2,"title":"colors.GREEN","slug":"colors-green","link":"#colors-green","children":[]},{"level":2,"title":"colors.BLUE","slug":"colors-blue","link":"#colors-blue","children":[]},{"level":2,"title":"colors.YELLOW","slug":"colors-yellow","link":"#colors-yellow","children":[]},{"level":2,"title":"colors.CYAN","slug":"colors-cyan","link":"#colors-cyan","children":[]},{"level":2,"title":"colors.MAGENTA","slug":"colors-magenta","link":"#colors-magenta","children":[]},{"level":2,"title":"colors.TRANSPARENT","slug":"colors-transparent","link":"#colors-transparent","children":[]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"colors.md"}');export{y as comp,E as data}; diff --git a/assets/console.html-NLWchUDA.js b/assets/console.html-CUwmR5SZ.js similarity index 99% rename from assets/console.html-NLWchUDA.js rename to assets/console.html-CUwmR5SZ.js index 2ce0e8e..89f8e3d 100644 --- a/assets/console.html-NLWchUDA.js +++ b/assets/console.html-CUwmR5SZ.js @@ -1,4 +1,4 @@ -import{_ as c,r as t,o as i,c as p,d as e,a as n,b as s,e as o}from"./app-CJv-W2Gj.js";const r={},u=n("h1",{id:"控制台-console",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#控制台-console"},[n("span",null,"控制台-console")])],-1),d=o('

该模块提供了一个和 Web 浏览器中相似的用于调试的控制台。用于输出一些调试信息、中间结果等。

console.show(autoHide)

  • autoHide {boolean} 当程序结束的时候是否自动隐藏

显示控制台。需要悬浮窗权限

console.hide()

隐藏控制台悬浮窗。

console.clear()

清空控制台。

console.log(...args)

',9),g=n("ul",null,[n("li",null,[n("code",null,"args"),s(" {any}")])],-1),h={href:"http://man7.org/linux/man-pages/man3/printf.3.html",target:"_blank",rel:"noopener noreferrer"},k=o(`
let  count = 5;
+import{_ as c,r as t,o as i,c as p,d as e,a as n,b as s,e as o}from"./app-BpvbY-DG.js";const r={},u=n("h1",{id:"控制台-console",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#控制台-console"},[n("span",null,"控制台-console")])],-1),d=o('

该模块提供了一个和 Web 浏览器中相似的用于调试的控制台。用于输出一些调试信息、中间结果等。

console.show(autoHide)

  • autoHide {boolean} 当程序结束的时候是否自动隐藏

显示控制台。需要悬浮窗权限

console.hide()

隐藏控制台悬浮窗。

console.clear()

清空控制台。

console.log(...args)

',9),g=n("ul",null,[n("li",null,[n("code",null,"args"),s(" {any}")])],-1),h={href:"http://man7.org/linux/man-pages/man3/printf.3.html",target:"_blank",rel:"noopener noreferrer"},k=o(`
let  count = 5;
 console.log(count);
 log(count);
 console.log("count: %d", count);
diff --git a/assets/continuation.html-BVTEm5pa.js b/assets/continuation.html-BDkg2Zig.js
similarity index 90%
rename from assets/continuation.html-BVTEm5pa.js
rename to assets/continuation.html-BDkg2Zig.js
index a10a774..81d4ef8 100644
--- a/assets/continuation.html-BVTEm5pa.js
+++ b/assets/continuation.html-BDkg2Zig.js
@@ -1 +1 @@
-import{_ as e,o as n,c as o,a as t,b as a}from"./app-CJv-W2Gj.js";const c={},i=t("h1",{id:"协程",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#协程"},[t("span",null,"协程")])],-1),s=t("p",null,[a("见 App 中 "),t("code",null,"示例代码 / 协程")],-1),l=[i,s];function r(m,d){return n(),o("div",null,l)}const h=e(c,[["render",r],["__file","continuation.html.vue"]]),p=JSON.parse('{"path":"/continuation.html","title":"协程","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"continuation.md"}');export{h as comp,p as data};
+import{_ as e,o as n,c as o,a as t,b as a}from"./app-BpvbY-DG.js";const c={},i=t("h1",{id:"协程",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#协程"},[t("span",null,"协程")])],-1),s=t("p",null,[a("见 App 中 "),t("code",null,"示例代码 / 协程")],-1),l=[i,s];function r(m,d){return n(),o("div",null,l)}const h=e(c,[["render",r],["__file","continuation.html.vue"]]),p=JSON.parse('{"path":"/continuation.html","title":"协程","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"continuation.md"}');export{h as comp,p as data};
diff --git a/assets/coordinatesBasedAutomation.html-CTgwQEvC.js b/assets/coordinatesBasedAutomation.html-DWGHa3yy.js
similarity index 99%
rename from assets/coordinatesBasedAutomation.html-CTgwQEvC.js
rename to assets/coordinatesBasedAutomation.html-DWGHa3yy.js
index 39450bb..2ae558c 100644
--- a/assets/coordinatesBasedAutomation.html-CTgwQEvC.js
+++ b/assets/coordinatesBasedAutomation.html-DWGHa3yy.js
@@ -1,4 +1,4 @@
-import{_ as t,r as o,o as e,c as p,d as a,e as s}from"./app-CJv-W2Gj.js";const c={},i=s(`

本章节介绍了一些使用坐标进行点击、滑动的函数。
要获取要点击的位置的坐标,可以在开发者选项中开启"指针位置"。
基于坐标的脚本通常会有分辨率的问题,这时可以通过setScreenMetrics()函数来进行自动坐标放缩。 这个函数会影响本章节的所有点击、长按、滑动等函数。通过设定脚本设计时的分辨率,使得脚本在其他分辨率下自动放缩坐标。

控件和坐标也可以相互结合。一些控件是无法点击的(clickable 为 false), 无法通过.click()函数来点击,这时如果安卓版本在 7.0 以上或者有 root 权限,就可以通过以下方式来点击:

//获取这个控件
+import{_ as t,r as o,o as e,c as p,d as a,e as s}from"./app-BpvbY-DG.js";const c={},i=s(`

本章节介绍了一些使用坐标进行点击、滑动的函数。
要获取要点击的位置的坐标,可以在开发者选项中开启"指针位置"。
基于坐标的脚本通常会有分辨率的问题,这时可以通过setScreenMetrics()函数来进行自动坐标放缩。 这个函数会影响本章节的所有点击、长按、滑动等函数。通过设定脚本设计时的分辨率,使得脚本在其他分辨率下自动放缩坐标。

控件和坐标也可以相互结合。一些控件是无法点击的(clickable 为 false), 无法通过.click()函数来点击,这时如果安卓版本在 7.0 以上或者有 root 权限,就可以通过以下方式来点击:

//获取这个控件
 var widget = id("xxx").findOne();
 //获取其中心位置并点击
 click(widget.bounds().centerX(), widget.bounds().centerY());
diff --git a/assets/crypto.html-B0TZyucO.js b/assets/crypto.html-oTPtLjbB.js
similarity index 99%
rename from assets/crypto.html-B0TZyucO.js
rename to assets/crypto.html-oTPtLjbB.js
index 9397f5f..84e26a0 100644
--- a/assets/crypto.html-B0TZyucO.js
+++ b/assets/crypto.html-oTPtLjbB.js
@@ -1,4 +1,4 @@
-import{_ as c,r as t,o as i,c as l,d as e,a as n,b as s,e as a}from"./app-CJv-W2Gj.js";const d={},u=n("h1",{id:"加密-crypto",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#加密-crypto"},[n("span",null,"加密-crypto")])],-1),r=a(`

$crypto 模块提供了对称加密(例如 AES)、非对称加密(例如 RSA)、消息摘要(例如 MD5, SHA)等支持。

$crypto.Key(data,[options])

  • data {any} 密钥的内容,根据 options.input 指定 data 的数据类型,默认为 string
  • options {Object} 密钥配置 options
  • return {Object} key
    • keyPair 密钥对对象。可以通过$crypto.generateKeyPair函数生成,或通过构造函数构造。
    • data 是 Key 的二进制数据。

构造函数,构造一个 Key 对象。

let key = new $crypto.Key("测试");
+import{_ as c,r as t,o as i,c as l,d as e,a as n,b as s,e as a}from"./app-BpvbY-DG.js";const d={},u=n("h1",{id:"加密-crypto",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#加密-crypto"},[n("span",null,"加密-crypto")])],-1),r=a(`

$crypto 模块提供了对称加密(例如 AES)、非对称加密(例如 RSA)、消息摘要(例如 MD5, SHA)等支持。

$crypto.Key(data,[options])

  • data {any} 密钥的内容,根据 options.input 指定 data 的数据类型,默认为 string
  • options {Object} 密钥配置 options
  • return {Object} key
    • keyPair 密钥对对象。可以通过$crypto.generateKeyPair函数生成,或通过构造函数构造。
    • data 是 Key 的二进制数据。

构造函数,构造一个 Key 对象。

let key = new $crypto.Key("测试");
 log({ key });
 

$crypto.generateKeyPair(algorithm, [length])

  • algorithm {string} 加密算法,可选值有:
    • DH
    • DSA
    • EC
    • RSA
  • length {number} 密钥长度。和算法相关,例如以位数指定的模数长度。默认为 256。
  • return {Object}
    • privateKey 私钥
    • publicKey 公钥

生成一对密钥,包括公钥和私钥。 例如在 RSA 加密算法中,我们可以用私钥加密,公钥解密做签名; 或者公钥加密,私钥解密做数据加密。

// 明文
 let message = "未加密字符串";
diff --git a/assets/device.html-iBdffhA8.js b/assets/device.html-PWFBXTZH.js
similarity index 99%
rename from assets/device.html-iBdffhA8.js
rename to assets/device.html-PWFBXTZH.js
index a296aeb..c3dc1da 100644
--- a/assets/device.html-iBdffhA8.js
+++ b/assets/device.html-PWFBXTZH.js
@@ -1,4 +1,4 @@
-import{_ as l,r as n,o as t,c as r,d,a as e,e as a,b as c}from"./app-CJv-W2Gj.js";const s={},o=e("h1",{id:"设备信息-device",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#设备信息-device"},[e("span",null,"设备信息-device")])],-1),v=a('

device

device 模块提供了与设备有关的信息与操作,例如获取设备宽高,内存使用率,IMEI,调整设备亮度、音量等。

device.width

  • return {number}

设备屏幕分辨率宽度。例如 1080。

device.height

  • return {number}

设备屏幕分辨率高度。例如 1920。

device.buildId

  • return {string}

修订版本号,或者诸如"M4-rc20"的标识。

device.broad

  • return {string}

The name of the underlying board, like "goldfish".

设备的主板(?)型号。

device.brand

  • return {string}

The consumer-visible brand with which the product/hardware will be associated, if any.

与产品或硬件相关的厂商品牌,如"Xiaomi", "Huawei"等。

device.device

  • return {string}

The name of the industrial design.

设备在工业设计中的名称。

device.model

  • return {string}

The end-user-visible name for the end product.

设备型号。

device.product

  • return {string}

The name of the overall product.

整个产品的名称。

device.bootloader

  • return {string}

The system bootloader version number.

设备 Bootloader 的版本。

device.hardware

  • return {string}

The name of the hardware (from the kernel command line or /proc).

设备的硬件名称(来自内核命令行或者/proc)。

device.fingerprint

  • return {string}

A string that uniquely identifies this build. Do not attempt to parse this value.

构建(build)的唯一标识码。

device.serial

  • return {string}

A hardware serial number, if available. Alphanumeric only, case-insensitive.

硬件序列号。

device.sdkInt

  • return {number}

The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES.

安卓系统 API 版本。例如安卓 4.4 的 sdkInt 为 19。

device.incremental

  • return {string}

The internal value used by the underlying source control to represent this build. E.g., a perforce changelist number or a git hash.

device.release

  • return {string}

The user-visible version string. E.g., "1.0" or "3.4b5".

Android 系统版本号。例如"5.0", "7.1.1"。

device.baseOS

  • return {string}

The base OS build the product is based on.

device.securityPatch

  • return {string}

The user-visible security patch level.

安全补丁程序级别。

device.codename

  • return {string}

The current development codename, or the string "REL" if this is a release build.

开发代号,例如发行版是"REL"。

device.getIMEI()

  • return {string}

返回设备的 IMEI.

device.getAndroidId()

  • return {string}

返回设备的 Android ID。

Android ID 为一个用 16 进制字符串表示的 64 位整数,在设备第一次使用时随机生成,之后不会更改,除非恢复出厂设置。

device.getMacAddress()

',76),u=a(`
  • return {string}

返回设备的 Mac 地址。该函数需要在有 WLAN 连接的情况下才能获取,否则会返回 null。

可能的后续修改:未来可能增加有 root 权限的情况下通过 root 权限获取,从而在没有 WLAN 连接的情况下也能返回正确的 Mac 地址,因此请勿使用此函数判断 WLAN 连接。

device.getBrightness()

  • return {number}

返回当前的(手动)亮度。范围为 0~255。

device.getBrightnessMode()

  • return {number}

返回当前亮度模式,0 为手动亮度,1 为自动亮度。

device.setBrightness(b)

  • b {number} 亮度,范围 0~255

设置当前手动亮度。如果当前是自动亮度模式,该函数不会影响屏幕的亮度。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setBrightnessMode(mode)

  • mode {number} 亮度模式,0 为手动亮度,1 为自动亮度

设置当前亮度模式。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.getMusicVolume()

  • return {number} 整数值

返回当前媒体音量。

device.getNotificationVolume()

  • return {number} 整数值

返回当前通知音量。

device.getAlarmVolume()

  • return {number} 整数值

返回当前闹钟音量。

device.getMusicMaxVolume()

  • return {number} 整数值

返回媒体音量的最大值。

device.getNotificationMaxVolume()

  • return {number} 整数值

返回通知音量的最大值。

device.getAlarmMaxVolume()

  • return {number} 整数值

返回闹钟音量的最大值。

device.setMusicVolume(volume)

  • volume {number} 音量

设置当前媒体音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setNotificationVolume(volume)

  • volume {number} 音量

设置当前通知音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setAlarmVolume(volume)

  • volume {number} 音量

设置当前闹钟音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.getBattery()

  • return {number} 0.0~100.0 的浮点数

返回当前电量百分比。

device.isCharging()

  • return {boolean}

返回设备是否正在充电。

device.getTotalMem()

  • return {number}

返回设备内存总量,单位字节(B)。1MB = 1024 * 1024B。

device.getAvailMem()

  • return {number}

返回设备当前可用的内存,单位字节(B)。

device.isScreenOn()

  • return {boolean}

返回设备屏幕是否是亮着的。如果屏幕亮着,返回true; 否则返回false

需要注意的是,类似于 vivo xplay 系列的息屏时钟不属于"屏幕亮着"的情况,虽然屏幕确实亮着但只能显示时钟而且不可交互,此时isScreenOn()也会返回false

device.wakeUp()

唤醒设备。包括唤醒设备 CPU、屏幕等。可以用来点亮屏幕。

device.wakeUpIfNeeded()

如果屏幕没有点亮,则唤醒设备。

device.keepScreenOn([timeout])

  • timeout {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。

保持屏幕常亮。

此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。

在某些设备上,如果不加参数 timeout,只能在 Auto.js 的界面保持屏幕常亮,在其他界面会自动失效,这是因为设备的省电策略造成的。因此,建议使用比较长的时长来代替"一直保持屏幕常亮"的功能,例如device.keepScreenOn(3600 * 1000)

可以使用device.cancelKeepingAwake()来取消屏幕常亮。

//一直保持屏幕常亮
+import{_ as l,r as n,o as t,c as r,d,a as e,e as a,b as c}from"./app-BpvbY-DG.js";const s={},o=e("h1",{id:"设备信息-device",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#设备信息-device"},[e("span",null,"设备信息-device")])],-1),v=a('

device

device 模块提供了与设备有关的信息与操作,例如获取设备宽高,内存使用率,IMEI,调整设备亮度、音量等。

device.width

  • return {number}

设备屏幕分辨率宽度。例如 1080。

device.height

  • return {number}

设备屏幕分辨率高度。例如 1920。

device.buildId

  • return {string}

修订版本号,或者诸如"M4-rc20"的标识。

device.broad

  • return {string}

The name of the underlying board, like "goldfish".

设备的主板(?)型号。

device.brand

  • return {string}

The consumer-visible brand with which the product/hardware will be associated, if any.

与产品或硬件相关的厂商品牌,如"Xiaomi", "Huawei"等。

device.device

  • return {string}

The name of the industrial design.

设备在工业设计中的名称。

device.model

  • return {string}

The end-user-visible name for the end product.

设备型号。

device.product

  • return {string}

The name of the overall product.

整个产品的名称。

device.bootloader

  • return {string}

The system bootloader version number.

设备 Bootloader 的版本。

device.hardware

  • return {string}

The name of the hardware (from the kernel command line or /proc).

设备的硬件名称(来自内核命令行或者/proc)。

device.fingerprint

  • return {string}

A string that uniquely identifies this build. Do not attempt to parse this value.

构建(build)的唯一标识码。

device.serial

  • return {string}

A hardware serial number, if available. Alphanumeric only, case-insensitive.

硬件序列号。

device.sdkInt

  • return {number}

The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES.

安卓系统 API 版本。例如安卓 4.4 的 sdkInt 为 19。

device.incremental

  • return {string}

The internal value used by the underlying source control to represent this build. E.g., a perforce changelist number or a git hash.

device.release

  • return {string}

The user-visible version string. E.g., "1.0" or "3.4b5".

Android 系统版本号。例如"5.0", "7.1.1"。

device.baseOS

  • return {string}

The base OS build the product is based on.

device.securityPatch

  • return {string}

The user-visible security patch level.

安全补丁程序级别。

device.codename

  • return {string}

The current development codename, or the string "REL" if this is a release build.

开发代号,例如发行版是"REL"。

device.getIMEI()

  • return {string}

返回设备的 IMEI.

device.getAndroidId()

  • return {string}

返回设备的 Android ID。

Android ID 为一个用 16 进制字符串表示的 64 位整数,在设备第一次使用时随机生成,之后不会更改,除非恢复出厂设置。

device.getMacAddress()

',76),u=a(`
  • return {string}

返回设备的 Mac 地址。该函数需要在有 WLAN 连接的情况下才能获取,否则会返回 null。

可能的后续修改:未来可能增加有 root 权限的情况下通过 root 权限获取,从而在没有 WLAN 连接的情况下也能返回正确的 Mac 地址,因此请勿使用此函数判断 WLAN 连接。

device.getBrightness()

  • return {number}

返回当前的(手动)亮度。范围为 0~255。

device.getBrightnessMode()

  • return {number}

返回当前亮度模式,0 为手动亮度,1 为自动亮度。

device.setBrightness(b)

  • b {number} 亮度,范围 0~255

设置当前手动亮度。如果当前是自动亮度模式,该函数不会影响屏幕的亮度。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setBrightnessMode(mode)

  • mode {number} 亮度模式,0 为手动亮度,1 为自动亮度

设置当前亮度模式。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.getMusicVolume()

  • return {number} 整数值

返回当前媒体音量。

device.getNotificationVolume()

  • return {number} 整数值

返回当前通知音量。

device.getAlarmVolume()

  • return {number} 整数值

返回当前闹钟音量。

device.getMusicMaxVolume()

  • return {number} 整数值

返回媒体音量的最大值。

device.getNotificationMaxVolume()

  • return {number} 整数值

返回通知音量的最大值。

device.getAlarmMaxVolume()

  • return {number} 整数值

返回闹钟音量的最大值。

device.setMusicVolume(volume)

  • volume {number} 音量

设置当前媒体音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setNotificationVolume(volume)

  • volume {number} 音量

设置当前通知音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.setAlarmVolume(volume)

  • volume {number} 音量

设置当前闹钟音量。

此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

device.getBattery()

  • return {number} 0.0~100.0 的浮点数

返回当前电量百分比。

device.isCharging()

  • return {boolean}

返回设备是否正在充电。

device.getTotalMem()

  • return {number}

返回设备内存总量,单位字节(B)。1MB = 1024 * 1024B。

device.getAvailMem()

  • return {number}

返回设备当前可用的内存,单位字节(B)。

device.isScreenOn()

  • return {boolean}

返回设备屏幕是否是亮着的。如果屏幕亮着,返回true; 否则返回false

需要注意的是,类似于 vivo xplay 系列的息屏时钟不属于"屏幕亮着"的情况,虽然屏幕确实亮着但只能显示时钟而且不可交互,此时isScreenOn()也会返回false

device.wakeUp()

唤醒设备。包括唤醒设备 CPU、屏幕等。可以用来点亮屏幕。

device.wakeUpIfNeeded()

如果屏幕没有点亮,则唤醒设备。

device.keepScreenOn([timeout])

  • timeout {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。

保持屏幕常亮。

此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。

在某些设备上,如果不加参数 timeout,只能在 Auto.js 的界面保持屏幕常亮,在其他界面会自动失效,这是因为设备的省电策略造成的。因此,建议使用比较长的时长来代替"一直保持屏幕常亮"的功能,例如device.keepScreenOn(3600 * 1000)

可以使用device.cancelKeepingAwake()来取消屏幕常亮。

//一直保持屏幕常亮
 device.keepScreenOn();
 

device.keepScreenDim([timeout])

  • timeout {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。

保持屏幕常亮,但允许屏幕变暗来节省电量。此函数可以用于定时脚本唤醒屏幕操作,不需要用户观看屏幕,可以让屏幕变暗来节省电量。

此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。

可以使用device.cancelKeepingAwake()来取消屏幕常亮。

device.cancelKeepingAwake()

取消设备保持唤醒状态。用于取消device.keepScreenOn(), device.keepScreenDim()等函数设置的屏幕常亮。

device.vibrate(millis)

  • millis {number} 震动时间,单位毫秒

使设备震动一段时间。

//震动两秒
 device.vibrate(2000);
diff --git a/assets/dialogs.html-DNd01AII.js b/assets/dialogs.html-vpK5itU1.js
similarity index 99%
rename from assets/dialogs.html-DNd01AII.js
rename to assets/dialogs.html-vpK5itU1.js
index cb0ed50..6641928 100644
--- a/assets/dialogs.html-DNd01AII.js
+++ b/assets/dialogs.html-vpK5itU1.js
@@ -1,4 +1,4 @@
-import{_ as c,r as o,o as l,c as i,d as s,a as n,b as e,e as t}from"./app-CJv-W2Gj.js";const u={},d=n("h1",{id:"对话框-dialogs",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#对话框-dialogs"},[n("span",null,"对话框-dialogs")])],-1),r=n("div",{class:"hint-container note"},[n("p",{class:"hint-container-title"},"注"),n("p",null,"dialogs 模块提供了简单的对话框支持,可以通过对话框和用户进行交互。")],-1),k={class:"hint-container tip"},v=n("p",{class:"hint-container-title"},"提示",-1),g={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise",target:"_blank",rel:"noopener noreferrer"},m=t(`
"ui";
+import{_ as c,r as o,o as l,c as i,d as s,a as n,b as e,e as t}from"./app-BpvbY-DG.js";const u={},d=n("h1",{id:"对话框-dialogs",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#对话框-dialogs"},[n("span",null,"对话框-dialogs")])],-1),r=n("div",{class:"hint-container note"},[n("p",{class:"hint-container-title"},"注"),n("p",null,"dialogs 模块提供了简单的对话框支持,可以通过对话框和用户进行交互。")],-1),k={class:"hint-container tip"},v=n("p",{class:"hint-container-title"},"提示",-1),g={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise",target:"_blank",rel:"noopener noreferrer"},m=t(`
"ui";
 //回调形式
 confirm("要清除所有缓存吗?", null, function (clear) {
   if (clear) {
diff --git a/assets/documentation.html-jc2thiJs.js b/assets/documentation.html-fn9sC5UJ.js
similarity index 99%
rename from assets/documentation.html-jc2thiJs.js
rename to assets/documentation.html-fn9sC5UJ.js
index 26a29f2..1e488da 100644
--- a/assets/documentation.html-jc2thiJs.js
+++ b/assets/documentation.html-fn9sC5UJ.js
@@ -1,4 +1,4 @@
-import{_ as a,r as i,o,c as d,a as e,d as n,b as t,e as r}from"./app-CJv-W2Gj.js";const c={},p=e("h1",{id:"关于本文档",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#关于本文档"},[e("span",null,"关于本文档")])],-1),u=e("p",null,"文档中使用一些标签来标记状态:",-1),m=e("h2",{id:"开发环境搭建",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#开发环境搭建"},[e("span",null,"开发环境搭建")])],-1),h={class:"hint-container important"},v=e("p",{class:"hint-container-title"},"插件信息",-1),b={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},_=e("br",null,null,-1),g=e("br",null,null,-1),x=e("br",null,null,-1),k=e("br",null,null,-1),f=e("br",null,null,-1),j=e("br",null,null,-1),C=e("br",null,null,-1),y=e("br",null,null,-1),S=e("br",null,null,-1),V={href:"https://github.com/kkevsekk1/webpack-autojs/archive/refs/heads/master.zip",target:"_blank",rel:"noopener noreferrer"},w=r(`
npm i -g webpack webpack-cli --registry=https://registry.npmmirror.com
+import{_ as a,r as i,o,c as d,a as e,d as n,b as t,e as r}from"./app-BpvbY-DG.js";const c={},p=e("h1",{id:"关于本文档",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#关于本文档"},[e("span",null,"关于本文档")])],-1),u=e("p",null,"文档中使用一些标签来标记状态:",-1),m=e("h2",{id:"开发环境搭建",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#开发环境搭建"},[e("span",null,"开发环境搭建")])],-1),h={class:"hint-container important"},v=e("p",{class:"hint-container-title"},"插件信息",-1),b={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},_=e("br",null,null,-1),g=e("br",null,null,-1),x=e("br",null,null,-1),k=e("br",null,null,-1),f=e("br",null,null,-1),j=e("br",null,null,-1),C=e("br",null,null,-1),y=e("br",null,null,-1),S=e("br",null,null,-1),V={href:"https://github.com/kkevsekk1/webpack-autojs/archive/refs/heads/master.zip",target:"_blank",rel:"noopener noreferrer"},w=r(`
npm i -g webpack webpack-cli --registry=https://registry.npmmirror.com
 npm install --registry=https://registry.npmmirror.com 
 
- webpack-autojs
     -common             <-- 公共文件
diff --git a/assets/engines.html-C5r9t3GG.js b/assets/engines.html-DM4PY1Q3.js
similarity index 99%
rename from assets/engines.html-C5r9t3GG.js
rename to assets/engines.html-DM4PY1Q3.js
index e9a1f4b..32b0fbb 100644
--- a/assets/engines.html-C5r9t3GG.js
+++ b/assets/engines.html-DM4PY1Q3.js
@@ -1,4 +1,4 @@
-import{_ as t,r as i,o as p,c,d as a,a as n,e}from"./app-CJv-W2Gj.js";const o={},l=n("h1",{id:"脚本引擎-engines",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#脚本引擎-engines"},[n("span",null,"脚本引擎-engines")])],-1),u=e(`

engines 模块包含了一些与脚本环境、脚本运行、脚本引擎有关的函数,包括运行其他脚本,关闭脚本等。

例如,获取脚本所在目录:

toast(engines.myEngine().cwd());
+import{_ as t,r as i,o as p,c,d as a,a as n,e}from"./app-BpvbY-DG.js";const o={},l=n("h1",{id:"脚本引擎-engines",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#脚本引擎-engines"},[n("span",null,"脚本引擎-engines")])],-1),u=e(`

engines 模块包含了一些与脚本环境、脚本运行、脚本引擎有关的函数,包括运行其他脚本,关闭脚本等。

例如,获取脚本所在目录:

toast(engines.myEngine().cwd());
 

engines.execScript(name, script[, config])

  • name {string} 要运行的脚本名称。这个名称和文件名称无关,只是在任务管理中显示的名称。
  • script {string} 要运行的脚本内容。
  • config {Object} 运行配置项
    • delay {number} 延迟执行的毫秒数,默认为 0
    • loopTimes {number} 循环运行次数,默认为 1。0 为无限循环。
    • interval {number} 循环运行时两次运行之间的时间间隔,默认为 0
    • path {Array} | {string} 指定脚本运行的目录。这些路径会用于 require 时寻找模块文件。

在新的脚本环境中运行脚本 script。返回一个ScriptExecution对象。

所谓新的脚本环境,指定是,脚本中的变量和原脚本的变量是不共享的,并且,脚本会在新的线程中运行。

最简单的例子如下:

engines.execScript("hello world", "toast('hello world')");
 

如果要循环运行,则:

//每隔 3 秒运行一次脚本,循环 10 次
 engines.execScript("hello world", "toast('hello world')", {
diff --git a/assets/events.html-_efPwSo4.js b/assets/events.html-CGm_tQ3C.js
similarity index 99%
rename from assets/events.html-_efPwSo4.js
rename to assets/events.html-CGm_tQ3C.js
index 06e5783..0f12fc1 100644
--- a/assets/events.html-_efPwSo4.js
+++ b/assets/events.html-CGm_tQ3C.js
@@ -1,4 +1,4 @@
-import{_ as i,r as a,o as c,c as l,d as e,a as n,b as s,w as u,e as t}from"./app-CJv-W2Gj.js";const r={},k=n("h1",{id:"事件与监听-events",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#事件与监听-events"},[n("span",null,"事件与监听-events")])],-1),d=t(`

events 模块提供了监听手机通知、按键、触摸的接口。您可以用他配合自动操作函数完成自动化工作。

events 本身是一个EventEmiiter, 但内置了一些事件、包括按键事件、通知事件、Toast 事件等。

需要注意的是,事件的处理是单线程的,并且仍然在原线程执行,如果脚本主体或者其他事件处理中有耗时操作、轮询等,则事件将无法得到及时处理(会进入事件队列等待脚本主体或其他事件处理完成才执行)。例如:

auto();
+import{_ as i,r as a,o as c,c as l,d as e,a as n,b as s,w as u,e as t}from"./app-BpvbY-DG.js";const r={},k=n("h1",{id:"事件与监听-events",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#事件与监听-events"},[n("span",null,"事件与监听-events")])],-1),d=t(`

events 模块提供了监听手机通知、按键、触摸的接口。您可以用他配合自动操作函数完成自动化工作。

events 本身是一个EventEmiiter, 但内置了一些事件、包括按键事件、通知事件、Toast 事件等。

需要注意的是,事件的处理是单线程的,并且仍然在原线程执行,如果脚本主体或者其他事件处理中有耗时操作、轮询等,则事件将无法得到及时处理(会进入事件队列等待脚本主体或其他事件处理完成才执行)。例如:

auto();
 events.observeNotification();
 events.on("toast", function (t) {
   //这段代码将得不到执行
diff --git a/assets/files.html-BDQk3btp.js b/assets/files.html-BygZEfOk.js
similarity index 99%
rename from assets/files.html-BDQk3btp.js
rename to assets/files.html-BygZEfOk.js
index 04180e6..06d5e63 100644
--- a/assets/files.html-BDQk3btp.js
+++ b/assets/files.html-BygZEfOk.js
@@ -1,4 +1,4 @@
-import{_ as n,r as s,o as t,c as i,d as l,a as e,e as p}from"./app-CJv-W2Gj.js";const o={},c=e("h1",{id:"文件系统-files",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文件系统-files"},[e("span",null,"文件系统-files")])],-1),d=p(`

files 模块提供了一些常见的文件处理,包括文件读写、移动、复制、删掉等。

一次性的文件读写可以直接使用files.read(), files.write(), files.append()等方便的函数,但如果需要频繁读写或随机读写,则使用open()函数打开一个文件对象来操作文件,并在操作完毕后调用close()函数关闭文件。

files.isFile(path)

  • path {string} 路径
  • return {boolean}

返回路径 path 是否是文件。

log(files.isDir("/sdcard/文件夹/")); //返回false
+import{_ as n,r as s,o as t,c as i,d as l,a as e,e as p}from"./app-BpvbY-DG.js";const o={},c=e("h1",{id:"文件系统-files",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文件系统-files"},[e("span",null,"文件系统-files")])],-1),d=p(`

files 模块提供了一些常见的文件处理,包括文件读写、移动、复制、删掉等。

一次性的文件读写可以直接使用files.read(), files.write(), files.append()等方便的函数,但如果需要频繁读写或随机读写,则使用open()函数打开一个文件对象来操作文件,并在操作完毕后调用close()函数关闭文件。

files.isFile(path)

  • path {string} 路径
  • return {boolean}

返回路径 path 是否是文件。

log(files.isDir("/sdcard/文件夹/")); //返回false
 log(files.isDir("/sdcard/文件.txt")); //返回true
 

files.isDir(path)

  • path {string} 路径
  • return {boolean}

返回路径 path 是否是文件夹。

log(files.isDir("/sdcard/文件夹/")); //返回true
 log(files.isDir("/sdcard/文件.txt")); //返回false
diff --git a/assets/floaty.html-CGwIKUry.js b/assets/floaty.html-C80y_NbK.js
similarity index 99%
rename from assets/floaty.html-CGwIKUry.js
rename to assets/floaty.html-C80y_NbK.js
index 33dab17..ef1b24f 100644
--- a/assets/floaty.html-CGwIKUry.js
+++ b/assets/floaty.html-C80y_NbK.js
@@ -1,4 +1,4 @@
-import{_ as t,r as o,o as i,c as l,d as s,a as n,e}from"./app-CJv-W2Gj.js";const p={},c=n("h1",{id:"悬浮窗-floaty",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#悬浮窗-floaty"},[n("span",null,"悬浮窗-floaty")])],-1),d=n("p",null,"floaty 模块提供了悬浮窗的相关函数,可以在屏幕上显示自定义悬浮窗,并控制悬浮窗的大小、位置等。 在使用 floaty 模块之前,应先检查并获取悬浮窗的权限,否则将无法正常执行悬浮窗相关的代码。检查和获取悬浮窗权限的方法如下:",-1),u=n("h2",{id:"floaty-checkpermission",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#floaty-checkpermission"},[n("span",null,"floaty.checkPermission()")])],-1),r=e(`

检查当前应用是否已经具有悬浮窗权限。

if (!floaty.checkPermission()) {
+import{_ as t,r as o,o as i,c as l,d as s,a as n,e}from"./app-BpvbY-DG.js";const p={},c=n("h1",{id:"悬浮窗-floaty",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#悬浮窗-floaty"},[n("span",null,"悬浮窗-floaty")])],-1),d=n("p",null,"floaty 模块提供了悬浮窗的相关函数,可以在屏幕上显示自定义悬浮窗,并控制悬浮窗的大小、位置等。 在使用 floaty 模块之前,应先检查并获取悬浮窗的权限,否则将无法正常执行悬浮窗相关的代码。检查和获取悬浮窗权限的方法如下:",-1),u=n("h2",{id:"floaty-checkpermission",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#floaty-checkpermission"},[n("span",null,"floaty.checkPermission()")])],-1),r=e(`

检查当前应用是否已经具有悬浮窗权限。

if (!floaty.checkPermission()) {
   toastLog("请先授予悬浮窗权限");
 } else {
   // 进行悬浮窗的相关操作
diff --git a/assets/global.html-C32Uu0XB.js b/assets/global.html-BMQDCODx.js
similarity index 99%
rename from assets/global.html-C32Uu0XB.js
rename to assets/global.html-BMQDCODx.js
index e109513..46c1f7a 100644
--- a/assets/global.html-C32Uu0XB.js
+++ b/assets/global.html-BMQDCODx.js
@@ -1,4 +1,4 @@
-import{_ as p,r as i,o as c,c as l,d as s,a as n,b as a,e as t}from"./app-CJv-W2Gj.js";const r={},d=n("h1",{id:"全局对象-global",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#全局对象-global"},[n("span",null,"全局对象-global")])],-1),u=t('

以下的对象是特定于 Auto.js 的。 有些内置对象是 JavaScript 语言本身的一部分,它们也是全局的。

一些模块中的函数为了使用方便也可以直接全局使用,这些函数在此不再赘述。

sleep(n)

  • n {number} 毫秒数

暂停运行 n毫秒的时间。1 秒等于 1000 毫秒。

currentPackage()

',6),k=n("ul",null,[n("li",null,[n("code",null,"return"),a(" {string}")])],-1),m=n("p",null,"返回最近一次监测到的正在运行的应用的包名,一般可以认为就是当前正在运行的应用的包名。",-1),h=n("p",null,"此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。",-1),v=n("h2",{id:"currentactivity",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#currentactivity"},[n("span",null,"currentActivity()")])],-1),g=t(`
  • return {string}

返回最近一次监测到的正在运行的 Activity 的名称,一般可以认为就是当前正在运行的 Activity 的名称。

此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。

setClip(text)

  • text {string} 文本

设置剪贴板内容。此剪贴板即系统剪贴板,在一般应用的输入框中"粘贴"既可使用。

getClip()

  • return {string}

返回系统剪贴板的内容。

toast(message)

  • message {string} 要显示的信息

以气泡显示信息 message 几秒。(具体时间取决于安卓系统,一般都是 2 秒)

注意

注意,连续显示多个 toast 时,会排队显示,即使脚本已经结束,toast 可能仍然会显示,记得添加延时,保证气泡消息消失才继续执行:

var _toast_ = toast;
+import{_ as p,r as i,o as c,c as l,d as s,a as n,b as a,e as t}from"./app-BpvbY-DG.js";const r={},d=n("h1",{id:"全局对象-global",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#全局对象-global"},[n("span",null,"全局对象-global")])],-1),u=t('

以下的对象是特定于 Auto.js 的。 有些内置对象是 JavaScript 语言本身的一部分,它们也是全局的。

一些模块中的函数为了使用方便也可以直接全局使用,这些函数在此不再赘述。

sleep(n)

  • n {number} 毫秒数

暂停运行 n毫秒的时间。1 秒等于 1000 毫秒。

currentPackage()

',6),k=n("ul",null,[n("li",null,[n("code",null,"return"),a(" {string}")])],-1),m=n("p",null,"返回最近一次监测到的正在运行的应用的包名,一般可以认为就是当前正在运行的应用的包名。",-1),h=n("p",null,"此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。",-1),v=n("h2",{id:"currentactivity",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#currentactivity"},[n("span",null,"currentActivity()")])],-1),g=t(`
  • return {string}

返回最近一次监测到的正在运行的 Activity 的名称,一般可以认为就是当前正在运行的 Activity 的名称。

此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。

setClip(text)

  • text {string} 文本

设置剪贴板内容。此剪贴板即系统剪贴板,在一般应用的输入框中"粘贴"既可使用。

getClip()

  • return {string}

返回系统剪贴板的内容。

toast(message)

  • message {string} 要显示的信息

以气泡显示信息 message 几秒。(具体时间取决于安卓系统,一般都是 2 秒)

注意

注意,连续显示多个 toast 时,会排队显示,即使脚本已经结束,toast 可能仍然会显示,记得添加延时,保证气泡消息消失才继续执行:

var _toast_ = toast;
 toast = function (message) {
   _toast_(message);
   sleep(2000);
diff --git a/assets/gmlkit.html-DQoPp91-.js b/assets/gmlkit.html-DQoPp91-.js
deleted file mode 100644
index 7edacef..0000000
--- a/assets/gmlkit.html-DQoPp91-.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import{_ as o,r as i,o as r,c,d as t,b as l,a as e,e as n}from"./app-CJv-W2Gj.js";const d={},u=e("h1",{id:"ml-kit-ocr",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ml-kit-ocr"},[e("span",null,"ML kit OCR")])],-1),p=e("h2",{id:"gmlkit-ocr-img-language",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#gmlkit-ocr-img-language"},[e("span",null,"gmlkit.ocr(img, language)")])],-1),h=e("p",null,"对给定的图像进行文字识别。",-1),g=e("li",null,[e("code",null,"img"),l(" {Image} 图片")],-1),m=e("code",null,"Language",-1),k=n("
  • la 拉丁
  • zh 中文
  • sa 梵文
  • ja 日语
  • ko 韩语
  • ",5),v={href:"https://developers.google.com/ml-kit/vision/text-recognition/v2/languages?hl=zh-cn",target:"_blank",rel:"noopener noreferrer"},_=e("li",null,[e("code",null,"retrun"),l("{"),e("a",{href:"#Result"},"Result"),l("} 文字识别结果。")],-1),f=n(`
    // 识别中文
    -let result = gmlkit.ocr(img, "zh");
    -console.log(result.text);
    -

    gmlkit.ocrText(img, language)

    对给定的图像进行文字识别,并返回识别到的文本字符串。

    `,3),b=e("li",null,[e("code",null,"img"),l(" {Image} 图片")],-1),x=e("code",null,"Language",-1),R=n("
  • la 拉丁
  • zh 中文
  • sa 梵文
  • ja 日语
  • ko 韩语
  • ",5),y={href:"https://developers.google.com/ml-kit/vision/text-recognition/v2/languages?hl=zh-cn",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,[e("code",null,"retrun"),l(" {String} 识别到的文本字符串。")],-1),j=n(`
    // 识别中文
    -let result = gmlkit.ocrText(img, "zh");
    -console.log(result);
    -

    Result

    表示 Google ML Kit 文字识别返回的结果,有以下几个属性:

    `,3),A=e("li",null,[e("code",null,"level"),l(" {Number} 结果的层级。")],-1),z=e("li",null,[e("code",null,"confidence"),l(" {Number} 识别结果的置信度。")],-1),L=e("li",null,[e("code",null,"text"),l(" {String} 识别到的文本。")],-1),S=e("li",null,[e("code",null,"language"),l(" {String} 识别到的语言。")],-1),B=e("code",null,"bounds",-1),J={href:"https://developer.android.google.cn/reference/kotlin/android/graphics/Rect?hl=en",target:"_blank",rel:"noopener noreferrer"},T=e("li",null,[e("code",null,"children"),l(" {Array} 子列表,包含更详细的内容。")],-1),q=n('

    Result.find(predicate)

    查找符合条件的第一个元素,没找到则返回 null

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.find(level,predicate)

    查找指定层级中符合条件的第一个元素,没找到则返回 null

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.filter(predicate)

    查找符合条件的所有元素

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.filter(level,predicate)

    在指定层级中查找符合条件的所有元素

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.toArray()

    将结果转换成数组

    • return {Array} Java 数组

    Result.toArray(level)

    将指定层级结果转换成数组

    • level {Number} 层级
    • return {Array} Java 数组

    Result.sort()

    根据bounds的位置对原结果进行排序

    Result.sorted()

    同上,返回排序后的 Result 对象

    • return {Result}

    ',23);function C(F,I){const s=i("Badge"),a=i("ExternalLinkIcon");return r(),c("div",null,[u,t(s,{type:"tip",text:"6.3.4+",vertical:"middle"}),l(),t(s,{type:"warning",text:"实验",vertical:"middle"}),p,h,e("ul",null,[g,e("li",null,[m,l(" {String} 识别语言,可选值为: "),e("ul",null,[k,e("li",null,[e("a",v,[l("其他语言"),t(a)])])])]),_]),f,e("ul",null,[b,e("li",null,[x,l(" {String} 识别语言,可选值为: "),e("ul",null,[R,e("li",null,[e("a",y,[l("其他语言"),t(a)])])])]),N]),j,e("ul",null,[A,z,L,S,e("li",null,[B,l(" {"),e("a",J,[l("Rect"),t(a)]),l("} 文本在图片中的位置")]),T]),q])}const w=o(d,[["render",C],["__file","gmlkit.html.vue"]]),E=JSON.parse('{"path":"/gmlkit.html","title":"ML kit OCR","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"gmlkit.ocr(img, language)","slug":"gmlkit-ocr-img-language","link":"#gmlkit-ocr-img-language","children":[]},{"level":2,"title":"gmlkit.ocrText(img, language)","slug":"gmlkit-ocrtext-img-language","link":"#gmlkit-ocrtext-img-language","children":[]},{"level":2,"title":"Result","slug":"result","link":"#result","children":[{"level":3,"title":"Result.find(predicate)","slug":"result-find-predicate","link":"#result-find-predicate","children":[]},{"level":3,"title":"Result.find(level,predicate)","slug":"result-find-level-predicate","link":"#result-find-level-predicate","children":[]},{"level":3,"title":"Result.filter(predicate)","slug":"result-filter-predicate","link":"#result-filter-predicate","children":[]},{"level":3,"title":"Result.filter(level,predicate)","slug":"result-filter-level-predicate","link":"#result-filter-level-predicate","children":[]},{"level":3,"title":"Result.toArray()","slug":"result-toarray","link":"#result-toarray","children":[]},{"level":3,"title":"Result.toArray(level)","slug":"result-toarray-level","link":"#result-toarray-level","children":[]},{"level":3,"title":"Result.sort()","slug":"result-sort","link":"#result-sort","children":[]},{"level":3,"title":"Result.sorted()","slug":"result-sorted","link":"#result-sorted","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"gmlkit.md"}');export{w as comp,E as data}; diff --git a/assets/gmlkit.html-Ureqrfme.js b/assets/gmlkit.html-Ureqrfme.js new file mode 100644 index 0000000..2798659 --- /dev/null +++ b/assets/gmlkit.html-Ureqrfme.js @@ -0,0 +1,7 @@ +import{_ as s,r as o,o as d,c as r,d as a,b as l,a as e,e as n}from"./app-BpvbY-DG.js";const c={},u=e("h1",{id:"ml-kit-ocr",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ml-kit-ocr"},[e("span",null,"ML kit OCR")])],-1),p=e("h2",{id:"gmlkit-ocr-img-language",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#gmlkit-ocr-img-language"},[e("span",null,"gmlkit.ocr(img, language)")])],-1),m=e("p",null,"对给定的图像进行文字识别。",-1),h=e("li",null,[e("code",null,"img"),l(" {Image} 图片")],-1),g=e("code",null,"Language",-1),_=e("li",null,[e("code",null,"zh"),l(" 中文")],-1),v=e("li",null,[e("code",null,"sa"),l(" 梵文")],-1),f=e("li",null,[e("code",null,"ja"),l(" 日语")],-1),k=e("li",null,[e("code",null,"ko"),l(" 韩语")],-1),R={href:"https://developers.google.com/ml-kit/vision/text-recognition/v2/languages?hl=zh-cn",target:"_blank",rel:"noopener noreferrer"},x=e("li",null,[e("code",null,"retrun"),l("{"),e("a",{href:"#Result"},"Result"),l("} 文字识别结果。")],-1),y=n(`
    // 识别中文
    +let result = gmlkit.ocr(img, "zh");
    +console.log(result.text);
    +

    gmlkit.ocrText(img, language)

    对给定的图像进行文字识别,并返回识别到的文本字符串。

    `,3),b=e("li",null,[e("code",null,"img"),l(" {Image} 图片")],-1),C=e("code",null,"Language",-1),O=e("li",null,[e("code",null,"zh"),l(" 中文")],-1),N=e("li",null,[e("code",null,"sa"),l(" 梵文")],-1),S=e("li",null,[e("code",null,"ja"),l(" 日语")],-1),T=e("li",null,[e("code",null,"ko"),l(" 韩语")],-1),P={href:"https://developers.google.com/ml-kit/vision/text-recognition/v2/languages?hl=zh-cn",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,[e("code",null,"retrun"),l(" {String} 识别到的文本字符串。")],-1),A=n(`
    // 识别中文
    +let result = gmlkit.ocrText(img, "zh");
    +console.log(result);
    +

    Result

    表示 Google ML Kit 文字识别返回的结果,有以下几个属性:

    `,3),I=e("li",null,[e("code",null,"level"),l(" {Number} 结果的层级。")],-1),j=e("li",null,[e("code",null,"confidence"),l(" {Number} 识别结果的置信度。")],-1),L=e("li",null,[e("code",null,"text"),l(" {String} 识别到的文本。")],-1),U=e("li",null,[e("code",null,"language"),l(" {String} 识别到的语言。")],-1),z=e("code",null,"bounds",-1),B={href:"https://developer.android.google.cn/reference/kotlin/android/graphics/Rect?hl=en",target:"_blank",rel:"noopener noreferrer"},w=e("li",null,[e("code",null,"children"),l(" {Array} 子列表,包含更详细的内容。")],-1),J=n('

    Result.find(predicate)

    查找符合条件的第一个元素,没找到则返回 null

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.find(level,predicate)

    查找指定层级中符合条件的第一个元素,没找到则返回 null

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.filter(predicate)

    查找符合条件的所有元素

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.filter(level,predicate)

    在指定层级中查找符合条件的所有元素

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.toArray()

    将结果转换成数组

    • return {Array} Java 数组

    Result.toArray(level)

    将指定层级结果转换成数组

    • level {Number} 层级
    • return {Array} Java 数组

    Result.sort()

    根据bounds的位置对原结果进行排序

    Result.sorted()

    同上,返回排序后的 Result 对象

    • return {Result}

    paddle

    ',24),q=n('

    paddle.ocr(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocrText(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    OcrResult

    OcrResult 是一个表示 OCR 结果的类。它包含以下字段:

    ',26),F=e("li",null,[e("code",null,"confidence"),l(" {Number} 识别的置信度。")],-1),V=e("li",null,[e("code",null,"preprocessTime"),l(" {Number} 预处理时间。")],-1),E=e("li",null,[e("code",null,"inferenceTime"),l(" {Number} 推理时间。")],-1),G=e("li",null,[e("code",null,"text"),l(" {String} 识别出的文本。")],-1),K=e("code",null,"bounds",-1),Y={href:"https://developer.android.google.cn/reference/kotlin/android/graphics/Rect?hl=en",target:"_blank",rel:"noopener noreferrer"},D={id:"tessract",tabindex:"-1"},H={class:"header-anchor",href:"#tessract"},Q={href:"https://github.com/wilinz/autoxjs-tessocr",target:"_blank",rel:"noopener noreferrer"};function W(X,Z){const t=o("Badge"),i=o("ExternalLinkIcon");return d(),r("div",null,[u,a(t,{type:"tip",text:"6.3.4+",vertical:"middle"}),l(),a(t,{type:"warning",text:"实验",vertical:"middle"}),p,m,e("ul",null,[h,e("li",null,[g,l(" {String} 识别语言,可选值为: "),e("ul",null,[_,v,f,k,e("li",null,[e("a",R,[l("其他语言"),a(i)])])])]),x]),y,e("ul",null,[b,e("li",null,[C,l(" {String} 识别语言,可选值为: "),e("ul",null,[O,N,S,T,e("li",null,[e("a",P,[l("其他语言"),a(i)])])])]),M]),A,e("ul",null,[I,j,L,U,e("li",null,[z,l(" {"),e("a",B,[l("Rect"),a(i)]),l("} 文本在图片中的位置")]),w]),J,a(t,{type:"tip",text:"5.6.1",vertical:"middle"}),l(),a(t,{type:"warning",text:"实验",vertical:"middle"}),q,e("ul",null,[F,V,E,G,e("li",null,[K,l(" {"),e("a",Y,[l("Rect"),a(i)]),l("} 文本在图像中的位置")])]),e("h1",D,[e("a",H,[e("span",null,[l("Tessract "),a(t,{type:"tip",text:"6.2.9",vertical:"top"}),l(),a(t,{type:"tip",text:"实验",vertical:"middle"})])])]),e("p",null,[l("前往 github 下载完整例子:"),e("a",Q,[l("Tessract OCR"),a(i)])])])}const ee=s(c,[["render",W],["__file","gmlkit.html.vue"]]),le=JSON.parse('{"path":"/gmlkit.html","title":"ML kit OCR","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"gmlkit.ocr(img, language)","slug":"gmlkit-ocr-img-language","link":"#gmlkit-ocr-img-language","children":[]},{"level":2,"title":"gmlkit.ocrText(img, language)","slug":"gmlkit-ocrtext-img-language","link":"#gmlkit-ocrtext-img-language","children":[]},{"level":2,"title":"Result","slug":"result","link":"#result","children":[{"level":3,"title":"Result.find(predicate)","slug":"result-find-predicate","link":"#result-find-predicate","children":[]},{"level":3,"title":"Result.find(level,predicate)","slug":"result-find-level-predicate","link":"#result-find-level-predicate","children":[]},{"level":3,"title":"Result.filter(predicate)","slug":"result-filter-predicate","link":"#result-filter-predicate","children":[]},{"level":3,"title":"Result.filter(level,predicate)","slug":"result-filter-level-predicate","link":"#result-filter-level-predicate","children":[]},{"level":3,"title":"Result.toArray()","slug":"result-toarray","link":"#result-toarray","children":[]},{"level":3,"title":"Result.toArray(level)","slug":"result-toarray-level","link":"#result-toarray-level","children":[]},{"level":3,"title":"Result.sort()","slug":"result-sort","link":"#result-sort","children":[]},{"level":3,"title":"Result.sorted()","slug":"result-sorted","link":"#result-sorted","children":[]}]},{"level":2,"title":"paddle.ocr(image,useSlim)","slug":"paddle-ocr-image-useslim","link":"#paddle-ocr-image-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,[cpuThreadNum,useSlim])","slug":"paddle-ocr-image-cputhreadnum-useslim","link":"#paddle-ocr-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,cpuThreadNum,myModelPath)","slug":"paddle-ocr-image-cputhreadnum-mymodelpath","link":"#paddle-ocr-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocr(image,myModelPath)","slug":"paddle-ocr-image-mymodelpath","link":"#paddle-ocr-image-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,useSlim)","slug":"paddle-ocrtext-image-useslim","link":"#paddle-ocrtext-image-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,[cpuThreadNum,useSlim])","slug":"paddle-ocrtext-image-cputhreadnum-useslim","link":"#paddle-ocrtext-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,cpuThreadNum,myModelPath)","slug":"paddle-ocrtext-image-cputhreadnum-mymodelpath","link":"#paddle-ocrtext-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,myModelPath)","slug":"paddle-ocrtext-image-mymodelpath","link":"#paddle-ocrtext-image-mymodelpath","children":[{"level":3,"title":"OcrResult","slug":"ocrresult","link":"#ocrresult","children":[]}]}],"git":{"updatedTime":1716001176000,"contributors":[{"name":"Lin","email":"106499400+LYS86@users.noreply.github.com","commits":1},{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"gmlkit.md"}');export{ee as comp,le as data}; diff --git a/assets/http.html-6scV030Z.js b/assets/http.html-BnJ2uyXo.js similarity index 99% rename from assets/http.html-6scV030Z.js rename to assets/http.html-BnJ2uyXo.js index 5d386c4..7df2c3f 100644 --- a/assets/http.html-6scV030Z.js +++ b/assets/http.html-BnJ2uyXo.js @@ -1,4 +1,4 @@ -import{_ as c,r as o,o as l,c as u,d as a,a as n,b as s,e as p}from"./app-CJv-W2Gj.js";const i={},r=n("h1",{id:"网络请求-http",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#网络请求-http"},[n("span",null,"网络请求-http")])],-1),d=p(`

    http 模块提供一些进行 http 请求的函数。

    http.get(url[, options, callback])

    • url {string} 请求的 URL 地址,需要以"http://"或"https://"开头。如果 url 没有以"http://"开头,则默认为"http://"。
    • options {Object} 请求选项。参见http.request()
    • callback {Function} 回调函数,可选,其参数是一个Response对象。如果不加回调函数,则该请求将阻塞、同步地执行。

    对地址 url 进行一次 HTTP GET 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应,(参见Response)。

    最简单 GET 请求如下:

    console.show();
    +import{_ as c,r as o,o as l,c as u,d as a,a as n,b as s,e as p}from"./app-BpvbY-DG.js";const i={},r=n("h1",{id:"网络请求-http",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#网络请求-http"},[n("span",null,"网络请求-http")])],-1),d=p(`

    http 模块提供一些进行 http 请求的函数。

    http.get(url[, options, callback])

    • url {string} 请求的 URL 地址,需要以"http://"或"https://"开头。如果 url 没有以"http://"开头,则默认为"http://"。
    • options {Object} 请求选项。参见http.request()
    • callback {Function} 回调函数,可选,其参数是一个Response对象。如果不加回调函数,则该请求将阻塞、同步地执行。

    对地址 url 进行一次 HTTP GET 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应,(参见Response)。

    最简单 GET 请求如下:

    console.show();
     var r = http.get("www.baidu.com");
     log("code = " + r.statusCode);
     log("html = " + r.body.string());
    diff --git a/assets/images.html-BYFpxzX5.js b/assets/images.html-DqwCdaN6.js
    similarity index 99%
    rename from assets/images.html-BYFpxzX5.js
    rename to assets/images.html-DqwCdaN6.js
    index e62fce9..b7bf767 100644
    --- a/assets/images.html-BYFpxzX5.js
    +++ b/assets/images.html-DqwCdaN6.js
    @@ -1,4 +1,4 @@
    -import{_ as l,r as o,o as c,c as p,d as a,a as n,b as s,e as i}from"./app-CJv-W2Gj.js";const u={},r=n("h1",{id:"图色模块-images",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#图色模块-images"},[n("span",null,"图色模块-Images")])],-1),d=i(`

    images 模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。 该模块分为两个部分,找图找色部分和图片处理部分。 需要注意的是,image 对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管 Auto.js 通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。 Image 对象通过调用recycle()函数来回收。例如:

    // 读取图片
    +import{_ as l,r as o,o as c,c as p,d as a,a as n,b as s,e as i}from"./app-BpvbY-DG.js";const u={},r=n("h1",{id:"图色模块-images",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#图色模块-images"},[n("span",null,"图色模块-Images")])],-1),d=i(`

    images 模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。 该模块分为两个部分,找图找色部分和图片处理部分。 需要注意的是,image 对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管 Auto.js 通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。 Image 对象通过调用recycle()函数来回收。例如:

    // 读取图片
     var img = images.read("./1.png");
     //对图片进行操作
     ...
    diff --git a/assets/index.html-QB9UjAb3.js b/assets/index.html-Cua4YK9l.js
    similarity index 95%
    rename from assets/index.html-QB9UjAb3.js
    rename to assets/index.html-Cua4YK9l.js
    index c8eec2e..81fdf02 100644
    --- a/assets/index.html-QB9UjAb3.js
    +++ b/assets/index.html-Cua4YK9l.js
    @@ -1 +1 @@
    -import{_ as t,o as e,c as a}from"./app-CJv-W2Gj.js";const i={};function l(o,c){return e(),a("div")}const n=t(i,[["render",l],["__file","index.html.vue"]]),r=JSON.parse('{"path":"/","title":"","lang":"zh-CN","frontmatter":{"home":true,"heroText":"AutoX.js","tagline":"安卓平台自动化测试软件","actions":[{"text":"快速开始","link":"/documentation.md","type":"primary"}],"features":[{"title":"强大且易用","details":"使用 JavaScript 开发,支持 ES5 和部分 ES6 特性。支持调用Java"},{"title":"社区支持","details":"提供了交流社区和应用商店,方便开发者交流和学习。"},{"title":"功能丰富","details":"提供了悬浮窗、文件系统、HTTP、WebSocket、图像处理、按键模拟等模块,满足多种自动化需求。"},{"title":"工程化支持","details":"结合 webpack 和 VSCode 插件,提供开发、编译、打包、部署、混淆、加密一体化支持。"},{"title":"网络通信","details":"支持 HTTP 请求和 WebSocket 通信。"},{"title":"开源项目","details":"您可以提交 PR(Pull Request)来修复 bug、添加新功能或改进文档。"}]},"headers":[],"git":{"updatedTime":1715920029000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":3}]},"filePathRelative":"README.md"}');export{n as comp,r as data};
    +import{_ as t,o as e,c as a}from"./app-BpvbY-DG.js";const i={};function l(o,c){return e(),a("div")}const n=t(i,[["render",l],["__file","index.html.vue"]]),r=JSON.parse('{"path":"/","title":"","lang":"zh-CN","frontmatter":{"home":true,"heroText":"AutoX.js","tagline":"安卓平台自动化测试软件","actions":[{"text":"快速开始","link":"/documentation.md","type":"primary"}],"features":[{"title":"强大且易用","details":"使用 JavaScript 开发,支持 ES5 和部分 ES6 特性。支持调用Java"},{"title":"社区支持","details":"提供了交流社区和应用商店,方便开发者交流和学习。"},{"title":"功能丰富","details":"提供了悬浮窗、文件系统、HTTP、WebSocket、图像处理、按键模拟等模块,满足多种自动化需求。"},{"title":"工程化支持","details":"结合 webpack 和 VSCode 插件,提供开发、编译、打包、部署、混淆、加密一体化支持。"},{"title":"网络通信","details":"支持 HTTP 请求和 WebSocket 通信。"},{"title":"开源项目","details":"您可以提交 PR(Pull Request)来修复 bug、添加新功能或改进文档。"}]},"headers":[],"git":{"updatedTime":1715920029000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":3}]},"filePathRelative":"README.md"}');export{n as comp,r as data};
    diff --git a/assets/keys.html-Zrol4FNU.js b/assets/keys.html-BMCtxNJF.js
    similarity index 99%
    rename from assets/keys.html-Zrol4FNU.js
    rename to assets/keys.html-BMCtxNJF.js
    index edbf8df..748cf8b 100644
    --- a/assets/keys.html-Zrol4FNU.js
    +++ b/assets/keys.html-BMCtxNJF.js
    @@ -1 +1 @@
    -import{_ as i,r as n,o,c as r,d,b as l,a as t,e as s}from"./app-CJv-W2Gj.js";const c={},a=t("h1",{id:"按键模拟",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#按键模拟"},[t("span",null,"按键模拟")])],-1),h=t("p",null,[l("按键模拟部分提供了一些模拟物理按键的全局函数,包括 Home、音量键、照相键等,有的函数依赖于无障碍服务,有的函数依赖于 root 权限。"),t("br"),l(" 一般来说,以大写字母开头的函数都依赖于 root 权限。执行此类函数时,如果没有 root 权限,则函数执行后没有效果,并会在控制台输出一个警告。")],-1),_=t("h2",{id:"back",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#back"},[t("span",null,"back()")])],-1),u=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),E=t("p",null,"模拟按下返回键。返回是否执行成功。",-1),p=t("h2",{id:"home",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#home"},[t("span",null,"home()")])],-1),C=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),O=t("p",null,"模拟按下 Home 键。返回是否执行成功。",-1),D=t("h2",{id:"powerdialog",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#powerdialog"},[t("span",null,"powerDialog()")])],-1),K=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),m=t("p",null,"弹出电源键菜单。返回是否执行成功。",-1),b=t("h2",{id:"notifications",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#notifications"},[t("span",null,"notifications()")])],-1),k=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),y=t("p",null,"拉出通知栏。返回是否执行成功。",-1),Y=t("h2",{id:"quicksettings",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#quicksettings"},[t("span",null,"quickSettings()")])],-1),x=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),v=t("p",null,"显示快速设置(下拉通知栏到底)。返回是否执行成功。",-1),f=t("h2",{id:"recents",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#recents"},[t("span",null,"recents()")])],-1),g=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),A=t("p",null,"显示最近任务。返回是否执行成功。",-1),S=t("h2",{id:"splitscreen",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#splitscreen"},[t("span",null,"splitScreen()")])],-1),R=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),T=t("p",null,[l("分屏。返回是否执行成功。"),t("br"),l(" 此函数"),t("strong",null,"需要系统自身功能的支持。")],-1),L=t("h2",{id:"takescreenshot",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#takescreenshot"},[t("span",null,"takeScreenshot()")])],-1),H=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),w=t("p",null,[l("模拟按键 "),t("strong",null,"电源键+音量下键"),l(" 截屏"),t("br"),l(" 不返回截屏得到的图片对象,只返回是否截图成功,图片保存到系统相册")],-1),N=t("h2",{id:"lockscreen",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#lockscreen"},[t("span",null,"lockScreen()")])],-1),P=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),B=t("p",null,[l("模拟按键 "),t("strong",null,"电源键"),l(" 锁屏")],-1),U=t("h2",{id:"dismissnotificationshade",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#dismissnotificationshade"},[t("span",null,"dismissNotificationShade()")])],-1),M=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),I=t("p",null,"关闭通知栏的操作",-1),V=t("h2",{id:"keycodeheadsethook",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#keycodeheadsethook"},[t("span",null,"keyCodeHeadsetHook()")])],-1),F=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),q=t("p",null,"发送 KEYCODE_HEADSETHOOK KeyEvent 的动作,用于接听/挂断通话和播放/停止媒体",-1),G=t("h2",{id:"accessibilityshortcut",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilityshortcut"},[t("span",null,"accessibilityShortcut()")])],-1),W=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),z=t("p",null,"触发辅助功能快捷方式的操作。此快捷方式有一个硬件触发器并且可以通过按住两个音量键来激活。",-1),J=t("h2",{id:"accessibilitybuttonchooser",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilitybuttonchooser"},[t("span",null,"accessibilityButtonChooser()")])],-1),Q=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),X=t("p",null,"调出辅助功能按钮的选择器菜单的操作",-1),Z=t("h2",{id:"accessibilitybutton",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilitybutton"},[t("span",null,"accessibilityButton()")])],-1),j=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),$=t("p",null,"触发辅助功能按钮的操作",-1),tt=t("h2",{id:"accessibilityallapps",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilityallapps"},[t("span",null,"accessibilityAllApps()")])],-1),et=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),dt=t("p",null,"显示 Launcher(启动器) 的所有应用的操作。",-1),lt=t("h2",{id:"home-1",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#home-1"},[t("span",null,"Home()")])],-1),it=t("p",null,"模拟按下 Home 键。",-1),nt=t("h2",{id:"back-1",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#back-1"},[t("span",null,"Back()")])],-1),ot=t("p",null,"模拟按下返回键。",-1),rt=t("h2",{id:"power",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#power"},[t("span",null,"Power()")])],-1),st=t("p",null,"模拟按下电源键。",-1),ct=t("h2",{id:"menu",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#menu"},[t("span",null,"Menu()")])],-1),at=t("p",null,"模拟按下菜单键。",-1),ht=t("h2",{id:"volumeup",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#volumeup"},[t("span",null,"VolumeUp()")])],-1),_t=t("p",null,"按下音量上键。",-1),ut=t("h2",{id:"volumedown",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#volumedown"},[t("span",null,"VolumeDown()")])],-1),Et=t("p",null,"按键音量上键。",-1),pt=t("h2",{id:"camera",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#camera"},[t("span",null,"Camera()")])],-1),Ct=t("p",null,"模拟按下照相键。",-1),Ot=t("h2",{id:"up",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#up"},[t("span",null,"Up()")])],-1),Dt=t("p",null,"模拟按下物理按键上。",-1),Kt=t("h2",{id:"down",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#down"},[t("span",null,"Down()")])],-1),mt=t("p",null,"模拟按下物理按键下。",-1),bt=t("h2",{id:"left",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#left"},[t("span",null,"Left()")])],-1),kt=t("p",null,"模拟按下物理按键左。",-1),yt=t("h2",{id:"right",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#right"},[t("span",null,"Right()")])],-1),Yt=t("p",null,"模拟按下物理按键右。",-1),xt=t("h2",{id:"ok",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#ok"},[t("span",null,"OK()")])],-1),vt=s('

    模拟按下物理按键确定。

    Text(text)

    • text {string} 要输入的文字,只能为英文或英文符号

    输入文字 text。例如Text("aaa");

    KeyCode(code)

    • code {number} | {String} 要按下的按键的数字代码或名称。KeyCode 对照表
      模拟物理按键。例如KeyCode(29)KeyCode("KEYCODE_A")是按下 A 键。

    附录: KeyCode 对照表

    KeyCodeKeyEvent Value
    KEYCODE_MENU1
    KEYCODE_SOFT_RIGHT2
    KEYCODE_HOME3
    KEYCODE_BACK4
    KEYCODE_CALL5
    KEYCODE_ENDCALL6
    KEYCODE_07
    KEYCODE_18
    KEYCODE_29
    KEYCODE_310
    KEYCODE_411
    KEYCODE_512
    KEYCODE_613
    KEYCODE_714
    KEYCODE_815
    KEYCODE_916
    KEYCODE_STAR17
    KEYCODE_POUND18
    KEYCODE_DPAD_UP19
    KEYCODE_DPAD_DOWN20
    KEYCODE_DPAD_LEFT21
    KEYCODE_DPAD_RIGHT22
    KEYCODE_DPAD_CENTER23
    KEYCODE_VOLUME_UP24
    KEYCODE_VOLUME_DOWN25
    KEYCODE_POWER26
    KEYCODE_CAMERA27
    KEYCODE_CLEAR28
    KEYCODE_A29
    KEYCODE_B30
    KEYCODE_C31
    KEYCODE_D32
    KEYCODE_E33
    KEYCODE_F34
    KEYCODE_G35
    KEYCODE_H36
    KEYCODE_I37
    KEYCODE_J38
    KEYCODE_K39
    KEYCODE_L40
    KEYCODE_M41
    KEYCODE_N42
    KEYCODE_O43
    KEYCODE_P44
    KEYCODE_Q45
    KEYCODE_R46
    KEYCODE_S47
    KEYCODE_T48
    KEYCODE_U49
    KEYCODE_V50
    KEYCODE_W51
    KEYCODE_X52
    KEYCODE_Y53
    KEYCODE_Z54
    KEYCODE_COMMA55
    KEYCODE_PERIOD56
    KEYCODE_ALT_LEFT57
    KEYCODE_ALT_RIGHT58
    KEYCODE_SHIFT_LEFT59
    KEYCODE_SHIFT_RIGHT60
    KEYCODE_TAB61
    KEYCODE_SPACE62
    KEYCODE_SYM63
    KEYCODE_EXPLORER64
    KEYCODE_ENVELOPE65
    KEYCODE_ENTER66
    KEYCODE_DEL67
    KEYCODE_GRAVE68
    KEYCODE_MINUS69
    KEYCODE_EQUALS70
    KEYCODE_LEFT_BRACKET71
    KEYCODE_RIGHT_BRACKET72
    KEYCODE_BACKSLASH73
    KEYCODE_SEMICOLON74
    KEYCODE_APOSTROPHE75
    KEYCODE_SLASH76
    KEYCODE_AT77
    KEYCODE_NUM78
    KEYCODE_HEADSETHOOK79
    KEYCODE_FOCUS80
    KEYCODE_PLUS81
    KEYCODE_MENU82
    KEYCODE_NOTIFICATION83
    KEYCODE_SEARCH84
    TAG_LAST_KEYCODE85
    ',8);function ft(gt,At){const e=n("Badge");return o(),r("div",null,[a,d(e,{type:"tip",text:"稳定",vertical:"middle"}),h,_,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),u,E,p,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),C,O,D,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),K,m,b,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),k,y,Y,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),x,v,f,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),g,A,S,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),R,T,L,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),l(),d(e,{type:"tip",text:"Android 9+",vertical:"middle"}),H,w,N,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 9+",vertical:"middle"}),P,B,U,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),M,I,V,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),F,q,G,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),W,z,J,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),Q,X,Z,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),j,$,tt,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),et,dt,lt,d(e,{type:"tip",text:"Root",vertical:"middle"}),it,nt,d(e,{type:"tip",text:"Root",vertical:"middle"}),ot,rt,d(e,{type:"tip",text:"Root",vertical:"middle"}),st,ct,d(e,{type:"tip",text:"Root",vertical:"middle"}),at,ht,d(e,{type:"tip",text:"Root",vertical:"middle"}),_t,ut,d(e,{type:"tip",text:"Root",vertical:"middle"}),Et,pt,Ct,Ot,d(e,{type:"tip",text:"Root",vertical:"middle"}),Dt,Kt,d(e,{type:"tip",text:"Root",vertical:"middle"}),mt,bt,d(e,{type:"tip",text:"Root",vertical:"middle"}),kt,yt,d(e,{type:"tip",text:"Root",vertical:"middle"}),Yt,xt,d(e,{type:"tip",text:"Root",vertical:"middle"}),vt])}const Rt=i(c,[["render",ft],["__file","keys.html.vue"]]),Tt=JSON.parse('{"path":"/keys.html","title":"按键模拟","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"back()","slug":"back","link":"#back","children":[]},{"level":2,"title":"home()","slug":"home","link":"#home","children":[]},{"level":2,"title":"powerDialog()","slug":"powerdialog","link":"#powerdialog","children":[]},{"level":2,"title":"notifications()","slug":"notifications","link":"#notifications","children":[]},{"level":2,"title":"quickSettings()","slug":"quicksettings","link":"#quicksettings","children":[]},{"level":2,"title":"recents()","slug":"recents","link":"#recents","children":[]},{"level":2,"title":"splitScreen()","slug":"splitscreen","link":"#splitscreen","children":[]},{"level":2,"title":"takeScreenshot()","slug":"takescreenshot","link":"#takescreenshot","children":[]},{"level":2,"title":"lockScreen()","slug":"lockscreen","link":"#lockscreen","children":[]},{"level":2,"title":"dismissNotificationShade()","slug":"dismissnotificationshade","link":"#dismissnotificationshade","children":[]},{"level":2,"title":"keyCodeHeadsetHook()","slug":"keycodeheadsethook","link":"#keycodeheadsethook","children":[]},{"level":2,"title":"accessibilityShortcut()","slug":"accessibilityshortcut","link":"#accessibilityshortcut","children":[]},{"level":2,"title":"accessibilityButtonChooser()","slug":"accessibilitybuttonchooser","link":"#accessibilitybuttonchooser","children":[]},{"level":2,"title":"accessibilityButton()","slug":"accessibilitybutton","link":"#accessibilitybutton","children":[]},{"level":2,"title":"accessibilityAllApps()","slug":"accessibilityallapps","link":"#accessibilityallapps","children":[]},{"level":2,"title":"Home()","slug":"home-1","link":"#home-1","children":[]},{"level":2,"title":"Back()","slug":"back-1","link":"#back-1","children":[]},{"level":2,"title":"Power()","slug":"power","link":"#power","children":[]},{"level":2,"title":"Menu()","slug":"menu","link":"#menu","children":[]},{"level":2,"title":"VolumeUp()","slug":"volumeup","link":"#volumeup","children":[]},{"level":2,"title":"VolumeDown()","slug":"volumedown","link":"#volumedown","children":[]},{"level":2,"title":"Camera()","slug":"camera","link":"#camera","children":[]},{"level":2,"title":"Up()","slug":"up","link":"#up","children":[]},{"level":2,"title":"Down()","slug":"down","link":"#down","children":[]},{"level":2,"title":"Left()","slug":"left","link":"#left","children":[]},{"level":2,"title":"Right()","slug":"right","link":"#right","children":[]},{"level":2,"title":"OK()","slug":"ok","link":"#ok","children":[]},{"level":2,"title":"Text(text)","slug":"text-text","link":"#text-text","children":[]},{"level":2,"title":"KeyCode(code)","slug":"keycode-code","link":"#keycode-code","children":[{"level":3,"title":"附录: KeyCode 对照表","slug":"附录-keycode-对照表","link":"#附录-keycode-对照表","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"keys.md"}');export{Rt as comp,Tt as data}; +import{_ as i,r as n,o,c as r,d,b as l,a as t,e as s}from"./app-BpvbY-DG.js";const c={},a=t("h1",{id:"按键模拟",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#按键模拟"},[t("span",null,"按键模拟")])],-1),h=t("p",null,[l("按键模拟部分提供了一些模拟物理按键的全局函数,包括 Home、音量键、照相键等,有的函数依赖于无障碍服务,有的函数依赖于 root 权限。"),t("br"),l(" 一般来说,以大写字母开头的函数都依赖于 root 权限。执行此类函数时,如果没有 root 权限,则函数执行后没有效果,并会在控制台输出一个警告。")],-1),_=t("h2",{id:"back",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#back"},[t("span",null,"back()")])],-1),u=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),E=t("p",null,"模拟按下返回键。返回是否执行成功。",-1),p=t("h2",{id:"home",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#home"},[t("span",null,"home()")])],-1),C=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),O=t("p",null,"模拟按下 Home 键。返回是否执行成功。",-1),D=t("h2",{id:"powerdialog",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#powerdialog"},[t("span",null,"powerDialog()")])],-1),K=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),m=t("p",null,"弹出电源键菜单。返回是否执行成功。",-1),b=t("h2",{id:"notifications",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#notifications"},[t("span",null,"notifications()")])],-1),k=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),y=t("p",null,"拉出通知栏。返回是否执行成功。",-1),Y=t("h2",{id:"quicksettings",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#quicksettings"},[t("span",null,"quickSettings()")])],-1),x=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),v=t("p",null,"显示快速设置(下拉通知栏到底)。返回是否执行成功。",-1),f=t("h2",{id:"recents",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#recents"},[t("span",null,"recents()")])],-1),g=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),A=t("p",null,"显示最近任务。返回是否执行成功。",-1),S=t("h2",{id:"splitscreen",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#splitscreen"},[t("span",null,"splitScreen()")])],-1),R=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),T=t("p",null,[l("分屏。返回是否执行成功。"),t("br"),l(" 此函数"),t("strong",null,"需要系统自身功能的支持。")],-1),L=t("h2",{id:"takescreenshot",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#takescreenshot"},[t("span",null,"takeScreenshot()")])],-1),H=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),w=t("p",null,[l("模拟按键 "),t("strong",null,"电源键+音量下键"),l(" 截屏"),t("br"),l(" 不返回截屏得到的图片对象,只返回是否截图成功,图片保存到系统相册")],-1),N=t("h2",{id:"lockscreen",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#lockscreen"},[t("span",null,"lockScreen()")])],-1),P=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),B=t("p",null,[l("模拟按键 "),t("strong",null,"电源键"),l(" 锁屏")],-1),U=t("h2",{id:"dismissnotificationshade",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#dismissnotificationshade"},[t("span",null,"dismissNotificationShade()")])],-1),M=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),I=t("p",null,"关闭通知栏的操作",-1),V=t("h2",{id:"keycodeheadsethook",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#keycodeheadsethook"},[t("span",null,"keyCodeHeadsetHook()")])],-1),F=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),q=t("p",null,"发送 KEYCODE_HEADSETHOOK KeyEvent 的动作,用于接听/挂断通话和播放/停止媒体",-1),G=t("h2",{id:"accessibilityshortcut",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilityshortcut"},[t("span",null,"accessibilityShortcut()")])],-1),W=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),z=t("p",null,"触发辅助功能快捷方式的操作。此快捷方式有一个硬件触发器并且可以通过按住两个音量键来激活。",-1),J=t("h2",{id:"accessibilitybuttonchooser",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilitybuttonchooser"},[t("span",null,"accessibilityButtonChooser()")])],-1),Q=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),X=t("p",null,"调出辅助功能按钮的选择器菜单的操作",-1),Z=t("h2",{id:"accessibilitybutton",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilitybutton"},[t("span",null,"accessibilityButton()")])],-1),j=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),$=t("p",null,"触发辅助功能按钮的操作",-1),tt=t("h2",{id:"accessibilityallapps",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#accessibilityallapps"},[t("span",null,"accessibilityAllApps()")])],-1),et=t("ul",null,[t("li",null,[t("code",null,"retrun"),l(" {boolean}")])],-1),dt=t("p",null,"显示 Launcher(启动器) 的所有应用的操作。",-1),lt=t("h2",{id:"home-1",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#home-1"},[t("span",null,"Home()")])],-1),it=t("p",null,"模拟按下 Home 键。",-1),nt=t("h2",{id:"back-1",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#back-1"},[t("span",null,"Back()")])],-1),ot=t("p",null,"模拟按下返回键。",-1),rt=t("h2",{id:"power",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#power"},[t("span",null,"Power()")])],-1),st=t("p",null,"模拟按下电源键。",-1),ct=t("h2",{id:"menu",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#menu"},[t("span",null,"Menu()")])],-1),at=t("p",null,"模拟按下菜单键。",-1),ht=t("h2",{id:"volumeup",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#volumeup"},[t("span",null,"VolumeUp()")])],-1),_t=t("p",null,"按下音量上键。",-1),ut=t("h2",{id:"volumedown",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#volumedown"},[t("span",null,"VolumeDown()")])],-1),Et=t("p",null,"按键音量上键。",-1),pt=t("h2",{id:"camera",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#camera"},[t("span",null,"Camera()")])],-1),Ct=t("p",null,"模拟按下照相键。",-1),Ot=t("h2",{id:"up",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#up"},[t("span",null,"Up()")])],-1),Dt=t("p",null,"模拟按下物理按键上。",-1),Kt=t("h2",{id:"down",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#down"},[t("span",null,"Down()")])],-1),mt=t("p",null,"模拟按下物理按键下。",-1),bt=t("h2",{id:"left",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#left"},[t("span",null,"Left()")])],-1),kt=t("p",null,"模拟按下物理按键左。",-1),yt=t("h2",{id:"right",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#right"},[t("span",null,"Right()")])],-1),Yt=t("p",null,"模拟按下物理按键右。",-1),xt=t("h2",{id:"ok",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#ok"},[t("span",null,"OK()")])],-1),vt=s('

    模拟按下物理按键确定。

    Text(text)

    • text {string} 要输入的文字,只能为英文或英文符号

    输入文字 text。例如Text("aaa");

    KeyCode(code)

    • code {number} | {String} 要按下的按键的数字代码或名称。KeyCode 对照表
      模拟物理按键。例如KeyCode(29)KeyCode("KEYCODE_A")是按下 A 键。

    附录: KeyCode 对照表

    KeyCodeKeyEvent Value
    KEYCODE_MENU1
    KEYCODE_SOFT_RIGHT2
    KEYCODE_HOME3
    KEYCODE_BACK4
    KEYCODE_CALL5
    KEYCODE_ENDCALL6
    KEYCODE_07
    KEYCODE_18
    KEYCODE_29
    KEYCODE_310
    KEYCODE_411
    KEYCODE_512
    KEYCODE_613
    KEYCODE_714
    KEYCODE_815
    KEYCODE_916
    KEYCODE_STAR17
    KEYCODE_POUND18
    KEYCODE_DPAD_UP19
    KEYCODE_DPAD_DOWN20
    KEYCODE_DPAD_LEFT21
    KEYCODE_DPAD_RIGHT22
    KEYCODE_DPAD_CENTER23
    KEYCODE_VOLUME_UP24
    KEYCODE_VOLUME_DOWN25
    KEYCODE_POWER26
    KEYCODE_CAMERA27
    KEYCODE_CLEAR28
    KEYCODE_A29
    KEYCODE_B30
    KEYCODE_C31
    KEYCODE_D32
    KEYCODE_E33
    KEYCODE_F34
    KEYCODE_G35
    KEYCODE_H36
    KEYCODE_I37
    KEYCODE_J38
    KEYCODE_K39
    KEYCODE_L40
    KEYCODE_M41
    KEYCODE_N42
    KEYCODE_O43
    KEYCODE_P44
    KEYCODE_Q45
    KEYCODE_R46
    KEYCODE_S47
    KEYCODE_T48
    KEYCODE_U49
    KEYCODE_V50
    KEYCODE_W51
    KEYCODE_X52
    KEYCODE_Y53
    KEYCODE_Z54
    KEYCODE_COMMA55
    KEYCODE_PERIOD56
    KEYCODE_ALT_LEFT57
    KEYCODE_ALT_RIGHT58
    KEYCODE_SHIFT_LEFT59
    KEYCODE_SHIFT_RIGHT60
    KEYCODE_TAB61
    KEYCODE_SPACE62
    KEYCODE_SYM63
    KEYCODE_EXPLORER64
    KEYCODE_ENVELOPE65
    KEYCODE_ENTER66
    KEYCODE_DEL67
    KEYCODE_GRAVE68
    KEYCODE_MINUS69
    KEYCODE_EQUALS70
    KEYCODE_LEFT_BRACKET71
    KEYCODE_RIGHT_BRACKET72
    KEYCODE_BACKSLASH73
    KEYCODE_SEMICOLON74
    KEYCODE_APOSTROPHE75
    KEYCODE_SLASH76
    KEYCODE_AT77
    KEYCODE_NUM78
    KEYCODE_HEADSETHOOK79
    KEYCODE_FOCUS80
    KEYCODE_PLUS81
    KEYCODE_MENU82
    KEYCODE_NOTIFICATION83
    KEYCODE_SEARCH84
    TAG_LAST_KEYCODE85
    ',8);function ft(gt,At){const e=n("Badge");return o(),r("div",null,[a,d(e,{type:"tip",text:"稳定",vertical:"middle"}),h,_,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),u,E,p,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),C,O,D,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),K,m,b,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),k,y,Y,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),x,v,f,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),g,A,S,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),R,T,L,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),l(),d(e,{type:"tip",text:"Android 9+",vertical:"middle"}),H,w,N,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 9+",vertical:"middle"}),P,B,U,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),M,I,V,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),F,q,G,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),W,z,J,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),Q,X,Z,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),j,$,tt,d(e,{type:"tip",text:"无障碍",vertical:"middle"}),d(e,{type:"tip",text:"Android 12+",vertical:"middle"}),et,dt,lt,d(e,{type:"tip",text:"Root",vertical:"middle"}),it,nt,d(e,{type:"tip",text:"Root",vertical:"middle"}),ot,rt,d(e,{type:"tip",text:"Root",vertical:"middle"}),st,ct,d(e,{type:"tip",text:"Root",vertical:"middle"}),at,ht,d(e,{type:"tip",text:"Root",vertical:"middle"}),_t,ut,d(e,{type:"tip",text:"Root",vertical:"middle"}),Et,pt,Ct,Ot,d(e,{type:"tip",text:"Root",vertical:"middle"}),Dt,Kt,d(e,{type:"tip",text:"Root",vertical:"middle"}),mt,bt,d(e,{type:"tip",text:"Root",vertical:"middle"}),kt,yt,d(e,{type:"tip",text:"Root",vertical:"middle"}),Yt,xt,d(e,{type:"tip",text:"Root",vertical:"middle"}),vt])}const Rt=i(c,[["render",ft],["__file","keys.html.vue"]]),Tt=JSON.parse('{"path":"/keys.html","title":"按键模拟","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"back()","slug":"back","link":"#back","children":[]},{"level":2,"title":"home()","slug":"home","link":"#home","children":[]},{"level":2,"title":"powerDialog()","slug":"powerdialog","link":"#powerdialog","children":[]},{"level":2,"title":"notifications()","slug":"notifications","link":"#notifications","children":[]},{"level":2,"title":"quickSettings()","slug":"quicksettings","link":"#quicksettings","children":[]},{"level":2,"title":"recents()","slug":"recents","link":"#recents","children":[]},{"level":2,"title":"splitScreen()","slug":"splitscreen","link":"#splitscreen","children":[]},{"level":2,"title":"takeScreenshot()","slug":"takescreenshot","link":"#takescreenshot","children":[]},{"level":2,"title":"lockScreen()","slug":"lockscreen","link":"#lockscreen","children":[]},{"level":2,"title":"dismissNotificationShade()","slug":"dismissnotificationshade","link":"#dismissnotificationshade","children":[]},{"level":2,"title":"keyCodeHeadsetHook()","slug":"keycodeheadsethook","link":"#keycodeheadsethook","children":[]},{"level":2,"title":"accessibilityShortcut()","slug":"accessibilityshortcut","link":"#accessibilityshortcut","children":[]},{"level":2,"title":"accessibilityButtonChooser()","slug":"accessibilitybuttonchooser","link":"#accessibilitybuttonchooser","children":[]},{"level":2,"title":"accessibilityButton()","slug":"accessibilitybutton","link":"#accessibilitybutton","children":[]},{"level":2,"title":"accessibilityAllApps()","slug":"accessibilityallapps","link":"#accessibilityallapps","children":[]},{"level":2,"title":"Home()","slug":"home-1","link":"#home-1","children":[]},{"level":2,"title":"Back()","slug":"back-1","link":"#back-1","children":[]},{"level":2,"title":"Power()","slug":"power","link":"#power","children":[]},{"level":2,"title":"Menu()","slug":"menu","link":"#menu","children":[]},{"level":2,"title":"VolumeUp()","slug":"volumeup","link":"#volumeup","children":[]},{"level":2,"title":"VolumeDown()","slug":"volumedown","link":"#volumedown","children":[]},{"level":2,"title":"Camera()","slug":"camera","link":"#camera","children":[]},{"level":2,"title":"Up()","slug":"up","link":"#up","children":[]},{"level":2,"title":"Down()","slug":"down","link":"#down","children":[]},{"level":2,"title":"Left()","slug":"left","link":"#left","children":[]},{"level":2,"title":"Right()","slug":"right","link":"#right","children":[]},{"level":2,"title":"OK()","slug":"ok","link":"#ok","children":[]},{"level":2,"title":"Text(text)","slug":"text-text","link":"#text-text","children":[]},{"level":2,"title":"KeyCode(code)","slug":"keycode-code","link":"#keycode-code","children":[{"level":3,"title":"附录: KeyCode 对照表","slug":"附录-keycode-对照表","link":"#附录-keycode-对照表","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"keys.md"}');export{Rt as comp,Tt as data}; diff --git a/assets/media.html-pHeOZNzu.js b/assets/media.html-Fq-NVCP1.js similarity index 99% rename from assets/media.html-pHeOZNzu.js rename to assets/media.html-Fq-NVCP1.js index d6c986f..62ebdf2 100644 --- a/assets/media.html-pHeOZNzu.js +++ b/assets/media.html-Fq-NVCP1.js @@ -1,4 +1,4 @@ -import{_ as s,r as e,o as i,c as t,d as p,a as n,e as c}from"./app-CJv-W2Gj.js";const o={},l=n("h1",{id:"多媒体-media",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#多媒体-media"},[n("span",null,"多媒体-media")])],-1),u=c(`

    media 模块提供多媒体编程的支持。目前仅支持音乐播放和媒体文件扫描。后续会结合 UI 加入视频播放等功能。

    需要注意是,使用该模块播放音乐时是在后台异步播放的,在脚本结束后会自动结束播放,因此可能需要插入诸如sleep()的语句来使脚本保持运行。例如:

    //播放音乐
    +import{_ as s,r as e,o as i,c as t,d as p,a as n,e as c}from"./app-BpvbY-DG.js";const o={},l=n("h1",{id:"多媒体-media",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#多媒体-media"},[n("span",null,"多媒体-media")])],-1),u=c(`

    media 模块提供多媒体编程的支持。目前仅支持音乐播放和媒体文件扫描。后续会结合 UI 加入视频播放等功能。

    需要注意是,使用该模块播放音乐时是在后台异步播放的,在脚本结束后会自动结束播放,因此可能需要插入诸如sleep()的语句来使脚本保持运行。例如:

    //播放音乐
     media.playMusic("/sdcard/1.mp3");
     //让音乐播放完
     sleep(media.getMusicDuration());
    diff --git a/assets/modules.html-B_vb7hEQ.js b/assets/modules.html-A8eJVWCy.js
    similarity index 98%
    rename from assets/modules.html-B_vb7hEQ.js
    rename to assets/modules.html-A8eJVWCy.js
    index 24fd091..dc49a39 100644
    --- a/assets/modules.html-B_vb7hEQ.js
    +++ b/assets/modules.html-A8eJVWCy.js
    @@ -1,4 +1,4 @@
    -import{_ as s,r as a,o as n,c,a as e,b as d,d as t,e as p}from"./app-CJv-W2Gj.js";const l={},i={id:"module-模块",tabindex:"-1"},r={class:"header-anchor",href:"#module-模块"},u=p(`

    AutoX.js 中的 module 模块是一个遵守 CommonJS 规范的模块系统实现,用于在脚本中加载和导出模块。

    exports

    exports 是一个空对象,用于将模块内的函数、变量和对象导出为模块的公共接口。可以将需要导出的内容直接赋值给 exports 对象的属性,例如:

    // 导出 add 函数
    +import{_ as s,r as a,o as n,c,a as e,b as d,d as t,e as p}from"./app-BpvbY-DG.js";const l={},i={id:"module-模块",tabindex:"-1"},r={class:"header-anchor",href:"#module-模块"},u=p(`

    AutoX.js 中的 module 模块是一个遵守 CommonJS 规范的模块系统实现,用于在脚本中加载和导出模块。

    exports

    exports 是一个空对象,用于将模块内的函数、变量和对象导出为模块的公共接口。可以将需要导出的内容直接赋值给 exports 对象的属性,例如:

    // 导出 add 函数
     exports.add = function (a, b) {
       return a + b;
     };
    diff --git a/assets/overview.html-BQPiPwQ8.js b/assets/overview.html-BVY4G8sO.js
    similarity index 99%
    rename from assets/overview.html-BQPiPwQ8.js
    rename to assets/overview.html-BVY4G8sO.js
    index aad54c4..1449f50 100644
    --- a/assets/overview.html-BQPiPwQ8.js
    +++ b/assets/overview.html-BVY4G8sO.js
    @@ -1 +1 @@
    -import{_ as l,r as n,o as s,c as a,a as e,b as t,d as r,e as i}from"./app-CJv-W2Gj.js";const c={},h=e("h1",{id:"综述",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#综述"},[e("span",null,"综述")])],-1),_={href:"https://github.com/hyb1996/Auto.js",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},d=e("p",null,"欢迎更多开发者参与这个项目的维护与升级。",-1),p=e("p",null,"这篇文档里有加密相关的内容可能和实际运行情况有冲突,我会逐步完善更新,程序代码,尽可能保持一致。",-1),k={href:"https://github.com/mozilla/rhino",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"学习 AutoX.js 的 API 之前,建议先学习 JavaScript 的基本语法。",-1),f={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/pboymt/autojs-dev",target:"_blank",rel:"noopener noreferrer"},g=e("h1",{id:"autox-js-下载地址",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autox-js-下载地址"},[e("span",null,"AutoX.js 下载地址")])],-1),v={href:"https://github.com/kkevsekk1/AutoX/releases",target:"_blank",rel:"noopener noreferrer"},x=e("h1",{id:"autox-js-的功能",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autox-js-的功能"},[e("span",null,"AutoX.js 的功能")])],-1),j={href:"https://github.com/kkevsekk1/webpack-autojs",target:"_blank",rel:"noopener noreferrer"},A={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/kkevsekk1/webpack-autojs",target:"_blank",rel:"noopener noreferrer"},S=e("li",null,"[x] 修复众多 bug,升级到 5.0.1 ,合并打包插件,升级配置文件等功能",-1),X={href:"http://www.autoxjs.com/",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,"[ ] 建设应用商店",-1),T=e("li",null,"[ ] 提供更好的 SDK 封装",-1),P=e("li",null,"[x] 支持 WebSocket",-1),y=e("h1",{id:"模块",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#模块"},[e("span",null,"模块")])],-1),E=e("p",null,'本文档的章节大致上是以模块来划分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。',-1),z={href:"/widgetsBasedAutomation",target:"_blank",rel:"noopener noreferrer"},B={href:"/coordinatesBasedAutomation",target:"_blank",rel:"noopener noreferrer"},I=i("

    基于坐标的操作是通过指定具体的屏幕坐标,进行点击,例如 click(100, 200) 等,这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对于一般软件脚本不是很高效,而且需要安卓 7.0 以上或 root 权限才能执行。

    软件类脚本(例如:批量添加联系人、自动提取短信验证码等等)我们推荐采用基于控件的模拟操作,结合通知、按键等达成更好的工作流。

    其他模块主要包括:

    • app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。
    • console: 控制台。记录运行的日志、错误、信息等。
    • device: 设备。获取设备屏幕宽高、系统版本等信息,控制设备音量、亮度等。
    • engines: 脚本引擎。用于启动其他脚本。
    • events: 事件与监听。按键监听,通知监听,触摸监听等。
    • floaty: 悬浮窗。用于显示自定义的悬浮窗。
    • files: 文件系统。文件创建、获取信息、读写。
    • http: HTTP。发送 HTTP 请求,例如 GET, POST 等。
    • websocket: websocket 客户端、服务器端,可以进行主动推送消息
    • images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。
    • keys: 按键模拟。比如音量键、Home 键模拟等。
    • shell: Shell 命令。
    • threads: 多线程支持。
    • ui: UI 界面。用于显示自定义的 UI 界面,和用户交互。
    ",4),J={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise",target:"_blank",rel:"noopener noreferrer"},R=e("h1",{id:"参与共建",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#参与共建"},[e("span",null,"参与共建")])],-1),V={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/kkevsekk1/AutoXJs-Docs",target:"_blank",rel:"noopener noreferrer"},G=e("p",null,"本文档更新稍有滞后,某些模块文档并没写完,希望有开发者共同参与维护!",-1),H=e("p",null,"不用担心你不懂,我们可以讨论交流!",-1),L=e("p",null,"欢迎大家 PR ,共同参与开源!",-1);function O(D,U){const o=n("ExternalLinkIcon");return s(),a("div",null,[h,e("p",null,[t("由于原作者不再维护 "),e("a",_,[t("Auto.js"),r(o)]),t(",我计划在原来 4.1 版本的基础上继续维护项目,并将原项目命名为 "),e("a",u,[t("AutoX.js"),r(o)]),t("。")]),d,p,e("p",null,[t("AutoX.js 使用 JavaScript 作为脚本语言,目前使用 "),e("a",k,[t("Rhino 1.7.13"),r(o)]),t(" 作为脚本引擎,支持 ES5 与部分 ES6 特性。")]),e("ul",null,[m,e("li",null,[t("如果想要在电脑上开发 AutoX.js,可以使用 VSCode 以及 "),e("a",f,[t("AutoX.js 插件"),r(o)]),t("。")]),e("li",null,[t("如果想要使用 TypeScript 来开发,目前有开发者公布了一个 "),e("a",b,[t("相关工具"),r(o)]),t("。")])]),g,e("p",null,[t("在 "),e("a",v,[t("Github Releases"),r(o)]),t(" 下载")]),x,e("ul",null,[e("li",null,[t("[x] AutoX.js 项目工程化:结合 webpack vscode 插件,开发、编译、打包、部署、混淆、加密一体化 "),e("a",j,[t("文档资料"),r(o)])]),e("li",null,[t("[x] vscode 插件右键,自动提示操作等 "),e("a",A,[t("下载地址"),r(o)])]),e("li",null,[t("[x] vscode 自动补全、方法注释等 "),e("a",w,[t("文档资料"),r(o)])]),S,e("li",null,[t("[x] 建设论坛、提供 "),e("a",X,[t("交流社区"),r(o)])]),N,T,P]),y,E,e("p",null,[t('"自动操作"的部分又可以大致分为 '),e("a",z,[t("基于控件"),r(o)]),t(" 和 "),e("a",B,[t("基于坐标"),r(o)]),t(" 的操作。")]),I,e("p",null,[t("除此之外,AutoX.js 内置了对 "),e("a",J,[t("Promise"),r(o)]),t(" 的支持。")]),R,e("p",null,[e("a",V,[t("软件源码"),r(o)])]),e("p",null,[e("a",C,[t("文档源码"),r(o)])]),G,H,L])}const K=l(c,[["render",O],["__file","overview.html.vue"]]),q=JSON.parse('{"path":"/overview.html","title":"综述","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"overview.md"}');export{K as comp,q as data}; +import{_ as l,r as n,o as s,c as a,a as e,b as t,d as r,e as i}from"./app-BpvbY-DG.js";const c={},h=e("h1",{id:"综述",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#综述"},[e("span",null,"综述")])],-1),_={href:"https://github.com/hyb1996/Auto.js",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},d=e("p",null,"欢迎更多开发者参与这个项目的维护与升级。",-1),p=e("p",null,"这篇文档里有加密相关的内容可能和实际运行情况有冲突,我会逐步完善更新,程序代码,尽可能保持一致。",-1),k={href:"https://github.com/mozilla/rhino",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"学习 AutoX.js 的 API 之前,建议先学习 JavaScript 的基本语法。",-1),f={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/pboymt/autojs-dev",target:"_blank",rel:"noopener noreferrer"},g=e("h1",{id:"autox-js-下载地址",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autox-js-下载地址"},[e("span",null,"AutoX.js 下载地址")])],-1),v={href:"https://github.com/kkevsekk1/AutoX/releases",target:"_blank",rel:"noopener noreferrer"},x=e("h1",{id:"autox-js-的功能",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autox-js-的功能"},[e("span",null,"AutoX.js 的功能")])],-1),j={href:"https://github.com/kkevsekk1/webpack-autojs",target:"_blank",rel:"noopener noreferrer"},A={href:"https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/kkevsekk1/webpack-autojs",target:"_blank",rel:"noopener noreferrer"},S=e("li",null,"[x] 修复众多 bug,升级到 5.0.1 ,合并打包插件,升级配置文件等功能",-1),X={href:"http://www.autoxjs.com/",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,"[ ] 建设应用商店",-1),T=e("li",null,"[ ] 提供更好的 SDK 封装",-1),P=e("li",null,"[x] 支持 WebSocket",-1),y=e("h1",{id:"模块",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#模块"},[e("span",null,"模块")])],-1),E=e("p",null,'本文档的章节大致上是以模块来划分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。',-1),z={href:"/widgetsBasedAutomation",target:"_blank",rel:"noopener noreferrer"},B={href:"/coordinatesBasedAutomation",target:"_blank",rel:"noopener noreferrer"},I=i("

    基于坐标的操作是通过指定具体的屏幕坐标,进行点击,例如 click(100, 200) 等,这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对于一般软件脚本不是很高效,而且需要安卓 7.0 以上或 root 权限才能执行。

    软件类脚本(例如:批量添加联系人、自动提取短信验证码等等)我们推荐采用基于控件的模拟操作,结合通知、按键等达成更好的工作流。

    其他模块主要包括:

    • app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。
    • console: 控制台。记录运行的日志、错误、信息等。
    • device: 设备。获取设备屏幕宽高、系统版本等信息,控制设备音量、亮度等。
    • engines: 脚本引擎。用于启动其他脚本。
    • events: 事件与监听。按键监听,通知监听,触摸监听等。
    • floaty: 悬浮窗。用于显示自定义的悬浮窗。
    • files: 文件系统。文件创建、获取信息、读写。
    • http: HTTP。发送 HTTP 请求,例如 GET, POST 等。
    • websocket: websocket 客户端、服务器端,可以进行主动推送消息
    • images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。
    • keys: 按键模拟。比如音量键、Home 键模拟等。
    • shell: Shell 命令。
    • threads: 多线程支持。
    • ui: UI 界面。用于显示自定义的 UI 界面,和用户交互。
    ",4),J={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise",target:"_blank",rel:"noopener noreferrer"},R=e("h1",{id:"参与共建",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#参与共建"},[e("span",null,"参与共建")])],-1),V={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/kkevsekk1/AutoXJs-Docs",target:"_blank",rel:"noopener noreferrer"},G=e("p",null,"本文档更新稍有滞后,某些模块文档并没写完,希望有开发者共同参与维护!",-1),H=e("p",null,"不用担心你不懂,我们可以讨论交流!",-1),L=e("p",null,"欢迎大家 PR ,共同参与开源!",-1);function O(D,U){const o=n("ExternalLinkIcon");return s(),a("div",null,[h,e("p",null,[t("由于原作者不再维护 "),e("a",_,[t("Auto.js"),r(o)]),t(",我计划在原来 4.1 版本的基础上继续维护项目,并将原项目命名为 "),e("a",u,[t("AutoX.js"),r(o)]),t("。")]),d,p,e("p",null,[t("AutoX.js 使用 JavaScript 作为脚本语言,目前使用 "),e("a",k,[t("Rhino 1.7.13"),r(o)]),t(" 作为脚本引擎,支持 ES5 与部分 ES6 特性。")]),e("ul",null,[m,e("li",null,[t("如果想要在电脑上开发 AutoX.js,可以使用 VSCode 以及 "),e("a",f,[t("AutoX.js 插件"),r(o)]),t("。")]),e("li",null,[t("如果想要使用 TypeScript 来开发,目前有开发者公布了一个 "),e("a",b,[t("相关工具"),r(o)]),t("。")])]),g,e("p",null,[t("在 "),e("a",v,[t("Github Releases"),r(o)]),t(" 下载")]),x,e("ul",null,[e("li",null,[t("[x] AutoX.js 项目工程化:结合 webpack vscode 插件,开发、编译、打包、部署、混淆、加密一体化 "),e("a",j,[t("文档资料"),r(o)])]),e("li",null,[t("[x] vscode 插件右键,自动提示操作等 "),e("a",A,[t("下载地址"),r(o)])]),e("li",null,[t("[x] vscode 自动补全、方法注释等 "),e("a",w,[t("文档资料"),r(o)])]),S,e("li",null,[t("[x] 建设论坛、提供 "),e("a",X,[t("交流社区"),r(o)])]),N,T,P]),y,E,e("p",null,[t('"自动操作"的部分又可以大致分为 '),e("a",z,[t("基于控件"),r(o)]),t(" 和 "),e("a",B,[t("基于坐标"),r(o)]),t(" 的操作。")]),I,e("p",null,[t("除此之外,AutoX.js 内置了对 "),e("a",J,[t("Promise"),r(o)]),t(" 的支持。")]),R,e("p",null,[e("a",V,[t("软件源码"),r(o)])]),e("p",null,[e("a",C,[t("文档源码"),r(o)])]),G,H,L])}const K=l(c,[["render",O],["__file","overview.html.vue"]]),q=JSON.parse('{"path":"/overview.html","title":"综述","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"overview.md"}');export{K as comp,q as data}; diff --git a/assets/paddle.html-BOLc6tRD.js b/assets/paddle.html-1F2D6lyd.js similarity index 99% rename from assets/paddle.html-BOLc6tRD.js rename to assets/paddle.html-1F2D6lyd.js index 0f980ae..6e429d8 100644 --- a/assets/paddle.html-BOLc6tRD.js +++ b/assets/paddle.html-1F2D6lyd.js @@ -1 +1 @@ -import{_ as o,r as c,o as r,c as t,d,b as l,a as e,e as m}from"./app-CJv-W2Gj.js";const u={},p=e("h1",{id:"paddle",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#paddle"},[e("span",null,"paddle")])],-1),n=m('

    paddle.ocr(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocrText(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    OcrResult

    OcrResult 是一个表示 OCR 结果的类。它包含以下字段:

    ',26),s=e("li",null,[e("code",null,"confidence"),l(" {Number} 识别的置信度。")],-1),h=e("li",null,[e("code",null,"preprocessTime"),l(" {Number} 预处理时间。")],-1),g=e("li",null,[e("code",null,"inferenceTime"),l(" {Number} 推理时间。")],-1),_=e("li",null,[e("code",null,"text"),l(" {String} 识别出的文本。")],-1),C=e("code",null,"bounds",-1),x={href:"https://developer.android.google.cn/reference/kotlin/android/graphics/Rect?hl=en",target:"_blank",rel:"noopener noreferrer"};function R(O,f){const a=c("Badge"),i=c("ExternalLinkIcon");return r(),t("div",null,[p,d(a,{type:"tip",text:"5.6.1",vertical:"middle"}),l(),d(a,{type:"warning",text:"实验",vertical:"middle"}),n,e("ul",null,[s,h,g,_,e("li",null,[C,l(" {"),e("a",x,[l("Rect"),d(i)]),l("} 文本在图像中的位置")])])])}const v=o(u,[["render",R],["__file","paddle.html.vue"]]),N=JSON.parse('{"path":"/paddle.html","title":"paddle","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"paddle.ocr(image,useSlim)","slug":"paddle-ocr-image-useslim","link":"#paddle-ocr-image-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,[cpuThreadNum,useSlim])","slug":"paddle-ocr-image-cputhreadnum-useslim","link":"#paddle-ocr-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,cpuThreadNum,myModelPath)","slug":"paddle-ocr-image-cputhreadnum-mymodelpath","link":"#paddle-ocr-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocr(image,myModelPath)","slug":"paddle-ocr-image-mymodelpath","link":"#paddle-ocr-image-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,useSlim)","slug":"paddle-ocrtext-image-useslim","link":"#paddle-ocrtext-image-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,[cpuThreadNum,useSlim])","slug":"paddle-ocrtext-image-cputhreadnum-useslim","link":"#paddle-ocrtext-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,cpuThreadNum,myModelPath)","slug":"paddle-ocrtext-image-cputhreadnum-mymodelpath","link":"#paddle-ocrtext-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,myModelPath)","slug":"paddle-ocrtext-image-mymodelpath","link":"#paddle-ocrtext-image-mymodelpath","children":[{"level":3,"title":"OcrResult","slug":"ocrresult","link":"#ocrresult","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"paddle.md"}');export{v as comp,N as data}; +import{_ as o,r as c,o as r,c as t,d,b as l,a as e,e as m}from"./app-BpvbY-DG.js";const u={},p=e("h1",{id:"paddle",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#paddle"},[e("span",null,"paddle")])],-1),n=m('

    paddle.ocr(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocrText(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    OcrResult

    OcrResult 是一个表示 OCR 结果的类。它包含以下字段:

    ',26),s=e("li",null,[e("code",null,"confidence"),l(" {Number} 识别的置信度。")],-1),h=e("li",null,[e("code",null,"preprocessTime"),l(" {Number} 预处理时间。")],-1),g=e("li",null,[e("code",null,"inferenceTime"),l(" {Number} 推理时间。")],-1),_=e("li",null,[e("code",null,"text"),l(" {String} 识别出的文本。")],-1),C=e("code",null,"bounds",-1),x={href:"https://developer.android.google.cn/reference/kotlin/android/graphics/Rect?hl=en",target:"_blank",rel:"noopener noreferrer"};function R(O,f){const a=c("Badge"),i=c("ExternalLinkIcon");return r(),t("div",null,[p,d(a,{type:"tip",text:"5.6.1",vertical:"middle"}),l(),d(a,{type:"warning",text:"实验",vertical:"middle"}),n,e("ul",null,[s,h,g,_,e("li",null,[C,l(" {"),e("a",x,[l("Rect"),d(i)]),l("} 文本在图像中的位置")])])])}const v=o(u,[["render",R],["__file","paddle.html.vue"]]),N=JSON.parse('{"path":"/paddle.html","title":"paddle","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"paddle.ocr(image,useSlim)","slug":"paddle-ocr-image-useslim","link":"#paddle-ocr-image-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,[cpuThreadNum,useSlim])","slug":"paddle-ocr-image-cputhreadnum-useslim","link":"#paddle-ocr-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocr(image,cpuThreadNum,myModelPath)","slug":"paddle-ocr-image-cputhreadnum-mymodelpath","link":"#paddle-ocr-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocr(image,myModelPath)","slug":"paddle-ocr-image-mymodelpath","link":"#paddle-ocr-image-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,useSlim)","slug":"paddle-ocrtext-image-useslim","link":"#paddle-ocrtext-image-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,[cpuThreadNum,useSlim])","slug":"paddle-ocrtext-image-cputhreadnum-useslim","link":"#paddle-ocrtext-image-cputhreadnum-useslim","children":[]},{"level":2,"title":"paddle.ocrText(image,cpuThreadNum,myModelPath)","slug":"paddle-ocrtext-image-cputhreadnum-mymodelpath","link":"#paddle-ocrtext-image-cputhreadnum-mymodelpath","children":[]},{"level":2,"title":"paddle.ocrText(image,myModelPath)","slug":"paddle-ocrtext-image-mymodelpath","link":"#paddle-ocrtext-image-mymodelpath","children":[{"level":3,"title":"OcrResult","slug":"ocrresult","link":"#ocrresult","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"paddle.md"}');export{v as comp,N as data}; diff --git a/assets/qa.html-gkdnqAK5.js b/assets/qa.html-D8huPY4F.js similarity index 99% rename from assets/qa.html-gkdnqAK5.js rename to assets/qa.html-D8huPY4F.js index 8449d6c..e48d269 100644 --- a/assets/qa.html-gkdnqAK5.js +++ b/assets/qa.html-D8huPY4F.js @@ -1,4 +1,4 @@ -import{_ as t,r as p,o as e,c as o,a as s,b as n,d as c,e as i}from"./app-CJv-W2Gj.js";const l={},u=i(`

    Q & A

    如何定时运行脚本

    点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持 Auto.js 后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js 没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

    定时任务如何获取外部参数

    如果一个脚本是用 intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的 intent,从而获取外部参数。

    如何把图片和脚本一起打包,或者打包多个脚本

    如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

    点击 Auto.js 的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的 apk 打包图标即可打包一个项目,点击工具栏可以重新配置项目。

    例如,主脚本要读取同一文件夹下的图片 1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录 1.png 图片;ui 中的图片控件要引用同一文件夹的 2.png 图片则为<img src="file://2.png"/>。Auto.js 内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

    如何使打包的应用不显示主界面

    需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:

    "launchConfig": {
    +import{_ as t,r as p,o as e,c as o,a as s,b as n,d as c,e as i}from"./app-BpvbY-DG.js";const l={},u=i(`

    Q & A

    如何定时运行脚本

    点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持 Auto.js 后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js 没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

    定时任务如何获取外部参数

    如果一个脚本是用 intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的 intent,从而获取外部参数。

    如何把图片和脚本一起打包,或者打包多个脚本

    如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

    点击 Auto.js 的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的 apk 打包图标即可打包一个项目,点击工具栏可以重新配置项目。

    例如,主脚本要读取同一文件夹下的图片 1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录 1.png 图片;ui 中的图片控件要引用同一文件夹的 2.png 图片则为<img src="file://2.png"/>。Auto.js 内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

    如何使打包的应用不显示主界面

    需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:

    "launchConfig": {
         "hideLogs": true
     }
     

    例如:

    {
    diff --git a/assets/shell.html-C9mviBbW.js b/assets/shell.html-CxaMeQ7b.js
    similarity index 99%
    rename from assets/shell.html-C9mviBbW.js
    rename to assets/shell.html-CxaMeQ7b.js
    index 447a3a6..edb2f88 100644
    --- a/assets/shell.html-C9mviBbW.js
    +++ b/assets/shell.html-CxaMeQ7b.js
    @@ -1,4 +1,4 @@
    -import{_ as o,r as n,o as p,c,d as s,a as e,b as a,e as t}from"./app-CJv-W2Gj.js";const r={},u=e("h1",{id:"shell-函数",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#shell-函数"},[e("span",null,"shell 函数")])],-1),d=t(`

    shell 即 Unix Shell,在类 Unix 系统提供与操作系统交互的一系列命令。

    很多程序可以用来执行 shell 命令,例如终端模拟器。

    在 Auto.js 大致等同于用 adb 执行命令 "adb shell"。

    其实现包括两种方式:

    • 通过java.lang.Runtime.exec执行(shell, Tap, Home 等函数)
    • 通过内嵌终端模拟器执行(RootAutomator, Shell 等对象)

    shell(cmd[, root])

    • cmd {string} 要执行的命令
    • root {Boolean} 是否以 root 权限运行,默认为 false。

    一次性执行命令 cmd, 并返回命令的执行结果。返回对象的其属性如下:

    • code {number} 返回码。执行成功时为 0,失败时为非 0 的数字。
    • result {string} 运行结果(stdout 输出结果)
    • error {string} 运行的错误信息(stderr 输出结果)。例如执行需要 root 权限的命令但没有授予 root 权限会返回错误信息"Permission denied"。

    示例(强制停止微信):

    var result = shell("am force-stop com.tencent.mm", true);
    +import{_ as o,r as n,o as p,c,d as s,a as e,b as a,e as t}from"./app-BpvbY-DG.js";const r={},u=e("h1",{id:"shell-函数",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#shell-函数"},[e("span",null,"shell 函数")])],-1),d=t(`

    shell 即 Unix Shell,在类 Unix 系统提供与操作系统交互的一系列命令。

    很多程序可以用来执行 shell 命令,例如终端模拟器。

    在 Auto.js 大致等同于用 adb 执行命令 "adb shell"。

    其实现包括两种方式:

    • 通过java.lang.Runtime.exec执行(shell, Tap, Home 等函数)
    • 通过内嵌终端模拟器执行(RootAutomator, Shell 等对象)

    shell(cmd[, root])

    • cmd {string} 要执行的命令
    • root {Boolean} 是否以 root 权限运行,默认为 false。

    一次性执行命令 cmd, 并返回命令的执行结果。返回对象的其属性如下:

    • code {number} 返回码。执行成功时为 0,失败时为非 0 的数字。
    • result {string} 运行结果(stdout 输出结果)
    • error {string} 运行的错误信息(stderr 输出结果)。例如执行需要 root 权限的命令但没有授予 root 权限会返回错误信息"Permission denied"。

    示例(强制停止微信):

    var result = shell("am force-stop com.tencent.mm", true);
     log(result);
     
     console.show();
    diff --git a/assets/storages.html-CX52M18A.js b/assets/storages.html-CPyYyGdl.js
    similarity index 99%
    rename from assets/storages.html-CX52M18A.js
    rename to assets/storages.html-CPyYyGdl.js
    index 169d346..f1c11e6 100644
    --- a/assets/storages.html-CX52M18A.js
    +++ b/assets/storages.html-CPyYyGdl.js
    @@ -1,4 +1,4 @@
    -import{_ as s,r as n,o as t,c as o,a as e,b as r,d as l,e as c}from"./app-CJv-W2Gj.js";const p={},i={id:"storages",tabindex:"-1"},u={class:"header-anchor",href:"#storages"},d=c(`

    storages 模块提供了保存简单数据、用户配置等的支持。保存的数据除非应用被卸载或者被主动删除,否则会一直保留。

    storages 支持number, boolean, string等数据类型以及把Object, ArrayJSON.stringify序列化存取。

    storages 保存的数据在脚本之间是共享的,任何脚本只要知道 storage 名称便可以获取到相应的数据,因此它不能用于敏感数据的储存。 storages 无法像 Web 开发中 LocalStorage 一样提供根据域名独立的存储,因为脚本的路径随时可能改变。

    storages.create(name)

    • name {string} 本地存储名称

    创建一个本地存储并返回一个Storage对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。

    例如在一个脚本中,创建名称为 ABC 的存储并存入 a=123:

    var storage = storages.create("ABC");
    +import{_ as s,r as n,o as t,c as o,a as e,b as r,d as l,e as c}from"./app-BpvbY-DG.js";const p={},i={id:"storages",tabindex:"-1"},u={class:"header-anchor",href:"#storages"},d=c(`

    storages 模块提供了保存简单数据、用户配置等的支持。保存的数据除非应用被卸载或者被主动删除,否则会一直保留。

    storages 支持number, boolean, string等数据类型以及把Object, ArrayJSON.stringify序列化存取。

    storages 保存的数据在脚本之间是共享的,任何脚本只要知道 storage 名称便可以获取到相应的数据,因此它不能用于敏感数据的储存。 storages 无法像 Web 开发中 LocalStorage 一样提供根据域名独立的存储,因为脚本的路径随时可能改变。

    storages.create(name)

    • name {string} 本地存储名称

    创建一个本地存储并返回一个Storage对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。

    例如在一个脚本中,创建名称为 ABC 的存储并存入 a=123:

    var storage = storages.create("ABC");
     storage.put("a", 123);
     

    而在另一个脚本中是可以获取到 ABC 以及 a 的值的:

    var storage = storages.create("ABC");
     log("a = " + storage.get("a"));
    diff --git a/assets/threads.html-BmvHvO8A.js b/assets/threads.html-CqgBgLf8.js
    similarity index 99%
    rename from assets/threads.html-BmvHvO8A.js
    rename to assets/threads.html-CqgBgLf8.js
    index 66ef1a4..4c3571e 100644
    --- a/assets/threads.html-BmvHvO8A.js
    +++ b/assets/threads.html-CqgBgLf8.js
    @@ -1,4 +1,4 @@
    -import{_ as i,r as c,o as u,c as r,d as a,a as n,b as s,w as p,e as o}from"./app-CJv-W2Gj.js";const d={},k=n("h1",{id:"线程-threads",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#线程-threads"},[n("span",null,"线程-threads")])],-1),v=o(`

    Threads 模块提供了多线程支持,可以启动新线程来运行脚本。

    脚本主线程会等待所有子线程执行完成后才停止执行,因此如果子线程中有死循环,请在必要的时候调用exit()来直接停止脚本或threads.shutDownAll()来停止所有子线程。

    通过threads.start()启动的所有线程会在脚本被强制停止时自动停止。

    由于 JavaScript 自身没有多线程的支持,因此您可能会遇到意料之外的问题。

    threads.start(action)

    • action {Function} 要在新线程执行的函数
    • retrun Thread

    启动一个新线程并执行 action。

    例如:

    threads.start(function () {
    +import{_ as i,r as c,o as u,c as r,d as a,a as n,b as s,w as p,e as o}from"./app-BpvbY-DG.js";const d={},k=n("h1",{id:"线程-threads",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#线程-threads"},[n("span",null,"线程-threads")])],-1),v=o(`

    Threads 模块提供了多线程支持,可以启动新线程来运行脚本。

    脚本主线程会等待所有子线程执行完成后才停止执行,因此如果子线程中有死循环,请在必要的时候调用exit()来直接停止脚本或threads.shutDownAll()来停止所有子线程。

    通过threads.start()启动的所有线程会在脚本被强制停止时自动停止。

    由于 JavaScript 自身没有多线程的支持,因此您可能会遇到意料之外的问题。

    threads.start(action)

    • action {Function} 要在新线程执行的函数
    • retrun Thread

    启动一个新线程并执行 action。

    例如:

    threads.start(function () {
       //在新线程执行的代码
       while (true) {
         log("子线程");
    diff --git a/assets/timers.html-BSmEQRmN.js b/assets/timers.html-BQHCdCJv.js
    similarity index 98%
    rename from assets/timers.html-BSmEQRmN.js
    rename to assets/timers.html-BQHCdCJv.js
    index ef04eba..9609305 100644
    --- a/assets/timers.html-BSmEQRmN.js
    +++ b/assets/timers.html-BQHCdCJv.js
    @@ -1,4 +1,4 @@
    -import{_ as s,r as e,o as t,c,d as l,a,e as o}from"./app-CJv-W2Gj.js";const i={},p=a("h1",{id:"timer-定时器",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#timer-定时器"},[a("span",null,"Timer - 定时器")])],-1),d=o(`

    timers 模块暴露了一个全局的 API,用于在某个未来时间段调用一个预定函数。

    由于定时器函数是全局的,因此使用该 API 无需调用 timers.XXXXX

    Auto.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API,除了它使用了一个不同的内部实现。它是基于 Android Looper-Handler 消息循环机制构建的,其实现机制与 Node.js 近似。

    例如,要在 5 秒后发出消息 "hello":

    setTimeout(function () {
    +import{_ as s,r as e,o as t,c,d as l,a,e as o}from"./app-BpvbY-DG.js";const i={},p=a("h1",{id:"timer-定时器",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#timer-定时器"},[a("span",null,"Timer - 定时器")])],-1),d=o(`

    timers 模块暴露了一个全局的 API,用于在某个未来时间段调用一个预定函数。

    由于定时器函数是全局的,因此使用该 API 无需调用 timers.XXXXX

    Auto.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API,除了它使用了一个不同的内部实现。它是基于 Android Looper-Handler 消息循环机制构建的,其实现机制与 Node.js 近似。

    例如,要在 5 秒后发出消息 "hello":

    setTimeout(function () {
       toast("hello");
     }, 5000);
     

    需要注意的是,这些定时器仍然是单线程的。如果脚本主体有耗时操作或死循环,则设定的定时器不能被及时执行,例如:

    setTimeout(function () {
    diff --git a/assets/util.html-q1x2JiuW.js b/assets/util.html-Bm6Y_sH1.js
    similarity index 99%
    rename from assets/util.html-q1x2JiuW.js
    rename to assets/util.html-Bm6Y_sH1.js
    index 103773c..e71f976 100644
    --- a/assets/util.html-q1x2JiuW.js
    +++ b/assets/util.html-Bm6Y_sH1.js
    @@ -1,4 +1,4 @@
    -import{_ as l,r as i,o as u,c as d,a as n,b as s,d as a,w as o,e}from"./app-CJv-W2Gj.js";const r={},k={id:"util",tabindex:"-1"},m={class:"header-anchor",href:"#util"},v=e(`

    稳定性: 稳定

    The util module is primarily designed to support the needs of Node.js' own internal APIs. However, many of the utilities are useful for application and module developers as well. It can be accessed using:

    const util = require("util");
    +import{_ as l,r as i,o as u,c as d,a as n,b as s,d as a,w as o,e}from"./app-BpvbY-DG.js";const r={},k={id:"util",tabindex:"-1"},m={class:"header-anchor",href:"#util"},v=e(`

    稳定性: 稳定

    The util module is primarily designed to support the needs of Node.js' own internal APIs. However, many of the utilities are useful for application and module developers as well. It can be accessed using:

    const util = require("util");
     

    util.callbackify(original)

    • original {Function} An async function
    • Returns: {Function} a callback style function

    Takes an async function (or a function that returns a Promise) and returns a function following the Node.js error first callback style. In the callback, the first argument will be the rejection reason (or null if the Promise resolved), and the second argument will be the resolved value.

    For example:

    const util = require("util");
     
     async function fn() {
    diff --git a/assets/webViewAndHtml.html-BWMzcJX2.js b/assets/webViewAndHtml.html-Dl_9qlIB.js
    similarity index 99%
    rename from assets/webViewAndHtml.html-BWMzcJX2.js
    rename to assets/webViewAndHtml.html-Dl_9qlIB.js
    index 63f92f4..eb9f67f 100644
    --- a/assets/webViewAndHtml.html-BWMzcJX2.js
    +++ b/assets/webViewAndHtml.html-Dl_9qlIB.js
    @@ -1,4 +1,4 @@
    -import{_ as n,o as s,c as a,e as t}from"./app-CJv-W2Gj.js";const p={},o=t(`

    WebView 与 HTML

    "ui";
    +import{_ as n,o as s,c as a,e as t}from"./app-BpvbY-DG.js";const p={},o=t(`

    WebView 与 HTML

    "ui";
     ui.layout(
       <vertical>
         <horizontal bg="#c7edcc" gravity="center" h="auto">
    diff --git a/assets/websocket.html-6u2APlAF.js b/assets/websocket.html-fhDf6v-S.js
    similarity index 99%
    rename from assets/websocket.html-6u2APlAF.js
    rename to assets/websocket.html-fhDf6v-S.js
    index 86b7c79..23de752 100644
    --- a/assets/websocket.html-6u2APlAF.js
    +++ b/assets/websocket.html-fhDf6v-S.js
    @@ -1,4 +1,4 @@
    -import{_ as o,r as p,o as c,c as l,a as n,b as s,d as a,e as i}from"./app-CJv-W2Gj.js";const u={},k={id:"websocket",tabindex:"-1"},r={class:"header-anchor",href:"#websocket"},d={href:"https://square.github.io/okhttp/",target:"_blank",rel:"noopener noreferrer"},v=i(`

    创建 websocket 客户端

    • 创建一个 http client,可以设定 client 是否重连,心跳等功能
    • 创建一个 request 请求对象,采用什么协议 ws 或 wss 、服务器、端口都能内容
    • 设置监听,当 websocket 生命周期内的一些事情。
    • 设置上面的操作以后,打开链接,创建 webSocket 客户端。
    • 用 webSocket 客户端 发送消息 webSocket.send("你好服务器");
    importPackage(Packages["okhttp3"]); //导入包
    +import{_ as o,r as p,o as c,c as l,a as n,b as s,d as a,e as i}from"./app-BpvbY-DG.js";const u={},k={id:"websocket",tabindex:"-1"},r={class:"header-anchor",href:"#websocket"},d={href:"https://square.github.io/okhttp/",target:"_blank",rel:"noopener noreferrer"},v=i(`

    创建 websocket 客户端

    • 创建一个 http client,可以设定 client 是否重连,心跳等功能
    • 创建一个 request 请求对象,采用什么协议 ws 或 wss 、服务器、端口都能内容
    • 设置监听,当 websocket 生命周期内的一些事情。
    • 设置上面的操作以后,打开链接,创建 webSocket 客户端。
    • 用 webSocket 客户端 发送消息 webSocket.send("你好服务器");
    importPackage(Packages["okhttp3"]); //导入包
     var client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();
     var request = new Request.Builder().url("ws://192.168.31.164:9317").build(); //vscode  插件的ip地址,
     client.dispatcher().cancelAll(); //清理一次
    diff --git a/assets/widgetsBasedAutomation.html-BBmiSycq.js b/assets/widgetsBasedAutomation.html-C8jiG5xu.js
    similarity index 99%
    rename from assets/widgetsBasedAutomation.html-BBmiSycq.js
    rename to assets/widgetsBasedAutomation.html-C8jiG5xu.js
    index 77c1da8..59633d2 100644
    --- a/assets/widgetsBasedAutomation.html-BBmiSycq.js
    +++ b/assets/widgetsBasedAutomation.html-C8jiG5xu.js
    @@ -1,4 +1,4 @@
    -import{_ as i,r as c,o as l,c as p,d as s,a as e,b as n,e as a}from"./app-CJv-W2Gj.js";const u={},r=e("h1",{id:"基于控件的操作",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基于控件的操作"},[e("span",null,"基于控件的操作")])],-1),d=a(`

    基于控件的操作指的是选择屏幕上的控件,获取其信息或对其进行操作。对于一般软件而言,基于控件的操作对不同机型有很好的兼容性;但是对于游戏而言,由于游戏界面并不是由控件构成,无法采用本章节的方法,也无法使用本章节的函数。有关游戏脚本的编写,请参考《基于坐标的操作》。

    基于控件的操作依赖于无障碍服务,因此最好在脚本开头使用auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面。这样的用户体验并不好,因为需要重新运行脚本,后续会加入等待无障碍服务启动并让脚本继续运行的函数。

    您也可以在脚本开头使用"auto";表示这个脚本需要无障碍服务,但是不推荐这种做法,因为这个标记必须在脚本的最开头(前面不能有注释或其他语句、空格等),我们推荐使用auto()函数来确保无障碍服务已启用。

    auto([mode])

    • mode {string} 模式

    检查无障碍服务是否已经启用,如果没有启用则抛出异常并跳转到无障碍服务启用界面;同时设置无障碍模式为 mode。mode 的可选值为:

    • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
    • normal 正常模式,默认。

    如果不加 mode 参数,则为正常模式。

    建议使用auto.waitFor()auto.setMode()代替该函数,因为auto()函数如果无障碍服务未启动会停止脚本;而auto.waitFor()则会在在无障碍服务启动后继续运行。

    示例:

    auto("fast");
    +import{_ as i,r as c,o as l,c as p,d as s,a as e,b as n,e as a}from"./app-BpvbY-DG.js";const u={},r=e("h1",{id:"基于控件的操作",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基于控件的操作"},[e("span",null,"基于控件的操作")])],-1),d=a(`

    基于控件的操作指的是选择屏幕上的控件,获取其信息或对其进行操作。对于一般软件而言,基于控件的操作对不同机型有很好的兼容性;但是对于游戏而言,由于游戏界面并不是由控件构成,无法采用本章节的方法,也无法使用本章节的函数。有关游戏脚本的编写,请参考《基于坐标的操作》。

    基于控件的操作依赖于无障碍服务,因此最好在脚本开头使用auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面。这样的用户体验并不好,因为需要重新运行脚本,后续会加入等待无障碍服务启动并让脚本继续运行的函数。

    您也可以在脚本开头使用"auto";表示这个脚本需要无障碍服务,但是不推荐这种做法,因为这个标记必须在脚本的最开头(前面不能有注释或其他语句、空格等),我们推荐使用auto()函数来确保无障碍服务已启用。

    auto([mode])

    • mode {string} 模式

    检查无障碍服务是否已经启用,如果没有启用则抛出异常并跳转到无障碍服务启用界面;同时设置无障碍模式为 mode。mode 的可选值为:

    • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
    • normal 正常模式,默认。

    如果不加 mode 参数,则为正常模式。

    建议使用auto.waitFor()auto.setMode()代替该函数,因为auto()函数如果无障碍服务未启动会停止脚本;而auto.waitFor()则会在在无障碍服务启动后继续运行。

    示例:

    auto("fast");
     

    示例 2:

    auto();
     

    auto.waitFor()

    检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动后脚本会继续运行。

    auto.setMode(mode)

    • mode {string} 模式

    设置无障碍模式为 mode。mode 的可选值为:

    • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
    • normal 正常模式,默认。

    SimpleActionAutomator

    稳定性: 稳定

    SimpleActionAutomator 提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。

    click(text[, i])

    • text {string} 要点击的文本
    • i {number} 如果相同的文本在屏幕中出现多次,则 i 表示要点击第几个文本, i 从 0 开始计算

    返回是否点击成功。当屏幕中并未包含该文本,或者该文本所在区域不能点击时返回 false,否则返回 true。

    该函数可以点击大部分包含文字的按钮。例如微信主界面下方的"微信", "联系人", "发现", "我"的按钮。
    通常与 while 同时使用以便点击按钮直至成功。例如:

    while (!click("扫一扫"));
     

    当不指定参数 i 时则会尝试点击屏幕上出现的所有文字 text 并返回是否全部点击成功。

    i 是从 0 开始计算的, 也就是, click("啦啦啦", 0)表示点击屏幕上第一个"啦啦啦", click("啦啦啦", 1)表示点击屏幕上第二个"啦啦啦"。

    文本所在区域指的是,从文本处向其父视图寻找,直至发现一个可点击的部件为止。

    click(left, top, bottom, right)

    • left {number} 要点击的长方形区域左边与屏幕左边的像素距离
    • top {number} 要点击的长方形区域上边与屏幕上边的像素距离
    • bottom {number} 要点击的长方形区域下边与屏幕下边的像素距离
    • right {number} 要点击的长方形区域右边与屏幕右边的像素距离

    注意,该函数一般只用于录制的脚本中使用,在自己写的代码中尽量不要使用该函数。

    点击在指定区域的控件。当屏幕中并未包含与该区域严格匹配的区域,或者该区域不能点击时返回 false,否则返回 true。

    有些按钮或者部件是图标而不是文字(例如发送朋友圈的照相机图标以及 QQ 下方的消息、联系人、动态图标),这时不能通过click(text, i)来点击,可以通过描述图标所在的区域来点击。left, bottom, top, right 描述的就是点击的区域。

    至于要定位点击的区域,可以在悬浮窗使用布局分析工具查看控件的 bounds 属性。

    通过无障碍服务录制脚本会生成该语句。

    longClick(text[, i]))

    • text {string} 要长按的文本
    • i {number} 如果相同的文本在屏幕中出现多次,则 i 表示要长按第几个文本, i 从 0 开始计算

    返回是否点击成功。当屏幕中并未包含该文本,或者该文本所在区域不能点击时返回 false,否则返回 true。

    当不指定参数 i 时则会尝试点击屏幕上出现的所有文字 text 并返回是否全部长按成功。

    scrollUp([i])

    • i {number} 要滑动的控件序号

    找到第 i+1 个可滑动控件上滑或左滑。返回是否操作成功。屏幕上没有可滑动的控件时返回 false。

    另外不加参数时scrollUp()会寻找面积最大的可滑动的控件上滑或左滑,例如微信消息列表等。

    参数为一个整数 i 时会找到第 i + 1 个可滑动控件滑动。例如scrollUp(0)为滑动第一个可滑动控件。

    scrollDown([i])

    • i {number} 要滑动的控件序号

    找到第 i+1 个可滑动控件下滑或右滑。返回是否操作成功。屏幕上没有可滑动的控件时返回 false。

    另外不加参数时scrollUp()会寻找面积最大的可滑动的控件下滑或右滑。

    参数为一个整数 i 时会找到第 i + 1 个可滑动控件滑动。例如scrollUp(0)为滑动第一个可滑动控件。

    setText([i, ]text)

    • i {number} 表示要输入的为第 i + 1 个输入框
    • text {string} 要输入的文本

    返回是否输入成功。当找不到对应的文本框时返回 false。

    不加参数 i 则会把所有输入框的文本都置为 text。例如setText("测试")

    这里的输入文本的意思是,把输入框的文本置为 text,而不是在原来的文本上追加。

    input([i, ]text)

    • i {number} 表示要输入的为第 i + 1 个输入框
    • text {string} 要输入的文本

    返回是否输入成功。当找不到对应的文本框时返回 false。

    不加参数 i 则会把所有输入框的文本追加内容 text。例如input("测试")

    UiSelector

    UiSelector 即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。这里需要先简单介绍一下控件和界面的相关知识。

    一般软件的界面是由一个个控件构成的,例如图片部分是一个图片控件(ImageView),文字部分是一个文字控件(TextView);同时,通过各种布局来决定各个控件的位置,例如,线性布局(LinearLayout)里面的控件都是按水平或垂直一次叠放的,列表布局(AbsListView)则是以列表的形式显示控件。

    控件有各种属性,包括文本(text), 描述(desc), 类名(className), id 等等。我们通常用一个控件的属性来找到这个控件,例如,想要点击 QQ 聊天窗口的"发送"按钮,我们就可以通过他的文本属性为"发送"来找到这个控件并点击他,具体代码为:

    var sendButton = text("发送").findOne();
    diff --git a/assets/workWithJava.html-JvVIUQ3K.js b/assets/workWithJava.html-QgyDNgzs.js
    similarity index 94%
    rename from assets/workWithJava.html-JvVIUQ3K.js
    rename to assets/workWithJava.html-QgyDNgzs.js
    index ac80975..728848c 100644
    --- a/assets/workWithJava.html-JvVIUQ3K.js
    +++ b/assets/workWithJava.html-QgyDNgzs.js
    @@ -1 +1 @@
    -import{_ as r,r as n,o as i,c as s,a as e,b as t,d as o}from"./app-CJv-W2Gj.js";const h={},c=e("h1",{id:"workwithjava",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#workwithjava"},[e("span",null,"WorkWithJava")])],-1),l={href:"https://p-bakker.github.io/rhino/tutorials/scripting_java/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/mozilla/rhino/issues/954#issuecomment-949763810",target:"_blank",rel:"noopener noreferrer"};function _(p,d){const a=n("ExternalLinkIcon");return i(),s("div",null,[c,e("p",null,[t("关于调用 java "),e("a",l,[t("请查看这里"),o(a)]),t(" ,一个由 Rhino 维护者使用 GitHub Pages 部署的 Rhino 文档网站")]),e("p",null,[e("a",m,[t("官方 issues 关于原 Rhino 文档地址 404 的讨论"),o(a)])])])}const u=r(h,[["render",_],["__file","workWithJava.html.vue"]]),v=JSON.parse('{"path":"/workWithJava.html","title":"WorkWithJava","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"workWithJava.md"}');export{u as comp,v as data};
    +import{_ as r,r as n,o as i,c as s,a as e,b as t,d as o}from"./app-BpvbY-DG.js";const h={},c=e("h1",{id:"workwithjava",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#workwithjava"},[e("span",null,"WorkWithJava")])],-1),l={href:"https://p-bakker.github.io/rhino/tutorials/scripting_java/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/mozilla/rhino/issues/954#issuecomment-949763810",target:"_blank",rel:"noopener noreferrer"};function _(p,d){const a=n("ExternalLinkIcon");return i(),s("div",null,[c,e("p",null,[t("关于调用 java "),e("a",l,[t("请查看这里"),o(a)]),t(" ,一个由 Rhino 维护者使用 GitHub Pages 部署的 Rhino 文档网站")]),e("p",null,[e("a",m,[t("官方 issues 关于原 Rhino 文档地址 404 的讨论"),o(a)])])])}const u=r(h,[["render",_],["__file","workWithJava.html.vue"]]),v=JSON.parse('{"path":"/workWithJava.html","title":"WorkWithJava","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"workWithJava.md"}');export{u as comp,v as data};
    diff --git a/assets/zips.html-Ctt-EwXk.js b/assets/zips.html-BE-3dQnm.js
    similarity index 98%
    rename from assets/zips.html-Ctt-EwXk.js
    rename to assets/zips.html-BE-3dQnm.js
    index 2b27481..134976b 100644
    --- a/assets/zips.html-Ctt-EwXk.js
    +++ b/assets/zips.html-BE-3dQnm.js
    @@ -1 +1 @@
    -import{_ as t,o as e,c as i,e as a}from"./app-CJv-W2Gj.js";const r={},s=a('

    压缩与解压

    zips 模块提供了压缩和解压缩文件的功能,支持多种常见的压缩格式。

    zips.A(type, filePath, dirPath, [password])

    将指定目录中的文件按照指定的格式压缩成文件后储存在指定的路径下。

    • type {string} - 压缩类型,支持的格式包括:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz。
    • filePath {string} - 压缩包存储的路径名称。
    • dirPath {string} - 需要压缩的目录完整路径名称。
    • password {string} - 可选参数,压缩密码。
    • retrun {number} - 压缩结果状态码

    zips.X(filePath, dirPath, [password])

    解压指定的压缩文件包,并将解压后的文件储存在指定的目录下。

    • filePath {string} - 压缩文件的完整路径名称,必须是以下支持的压缩格式之一:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz、rar、chm、iso、msi。
    • dirPath {string} - 解压后的文件存储的目录完整路径名称。
    • [password?] {string} - 可选参数,压缩密码。
    • retrun {number} - 解压缩结果状态码

    状态码

    状态码返回值含义
    0压缩/解压缩成功,文件已保存到指定路径
    1压缩/解压缩结束,存在非致命错误(例如某些文件正在被使用,没有被压缩/解压缩)
    2致命错误
    7命令行错误
    8没有足够内存
    255用户中止操作
    其他未知错误
    ',10),d=[s];function l(n,p){return e(),i("div",null,d)}const h=t(r,[["render",l],["__file","zips.html.vue"]]),o=JSON.parse('{"path":"/zips.html","title":"压缩与解压","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"zips.A(type, filePath, dirPath, [password])","slug":"zips-a-type-filepath-dirpath-password","link":"#zips-a-type-filepath-dirpath-password","children":[]},{"level":2,"title":"zips.X(filePath, dirPath, [password])","slug":"zips-x-filepath-dirpath-password","link":"#zips-x-filepath-dirpath-password","children":[{"level":3,"title":"状态码","slug":"状态码","link":"#状态码","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"zips.md"}');export{h as comp,o as data}; +import{_ as t,o as e,c as i,e as a}from"./app-BpvbY-DG.js";const r={},s=a('

    压缩与解压

    zips 模块提供了压缩和解压缩文件的功能,支持多种常见的压缩格式。

    zips.A(type, filePath, dirPath, [password])

    将指定目录中的文件按照指定的格式压缩成文件后储存在指定的路径下。

    • type {string} - 压缩类型,支持的格式包括:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz。
    • filePath {string} - 压缩包存储的路径名称。
    • dirPath {string} - 需要压缩的目录完整路径名称。
    • password {string} - 可选参数,压缩密码。
    • retrun {number} - 压缩结果状态码

    zips.X(filePath, dirPath, [password])

    解压指定的压缩文件包,并将解压后的文件储存在指定的目录下。

    • filePath {string} - 压缩文件的完整路径名称,必须是以下支持的压缩格式之一:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz、rar、chm、iso、msi。
    • dirPath {string} - 解压后的文件存储的目录完整路径名称。
    • [password?] {string} - 可选参数,压缩密码。
    • retrun {number} - 解压缩结果状态码

    状态码

    状态码返回值含义
    0压缩/解压缩成功,文件已保存到指定路径
    1压缩/解压缩结束,存在非致命错误(例如某些文件正在被使用,没有被压缩/解压缩)
    2致命错误
    7命令行错误
    8没有足够内存
    255用户中止操作
    其他未知错误
    ',10),d=[s];function l(n,p){return e(),i("div",null,d)}const h=t(r,[["render",l],["__file","zips.html.vue"]]),o=JSON.parse('{"path":"/zips.html","title":"压缩与解压","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"zips.A(type, filePath, dirPath, [password])","slug":"zips-a-type-filepath-dirpath-password","link":"#zips-a-type-filepath-dirpath-password","children":[]},{"level":2,"title":"zips.X(filePath, dirPath, [password])","slug":"zips-x-filepath-dirpath-password","link":"#zips-x-filepath-dirpath-password","children":[{"level":3,"title":"状态码","slug":"状态码","link":"#状态码","children":[]}]}],"git":{"updatedTime":1713029763000,"contributors":[{"name":"Lin","email":"yditmxpev@mozmail.com","commits":1}]},"filePathRelative":"zips.md"}');export{h as comp,o as data}; diff --git a/base64.html b/base64.html index 2cd31b7..bd80c20 100644 --- a/base64.html +++ b/base64.html @@ -27,8 +27,8 @@ Base64 编码 | AutoX - - + +

    Base64 编码

    稳定

    提供基本的 Base64 转换函数。

    $base64.encode(str[, encoding = 'utf-8'])

    • str {string} 要编码的字符串
    • encoding {string} 可选,字符编码

    将字符串使用 Base64 编码并返回编码后的字符串。

    log($base64.encode("autox.js"));
    @@ -36,6 +36,6 @@
     

    $base64.decode(str[, encoding = 'utf-8'])

    • str {string} 要解码的字符串
    • encoding {string} 可选,字符编码

    将字符串使用 Base64 解码并返回解码后的字符串。

    log($base64.decode("YXV0b3guanM="));
     // 日志输出 autox.js
     
    - + diff --git a/canvas.html b/canvas.html index 4b76488..bf9edec 100644 --- a/canvas.html +++ b/canvas.html @@ -27,8 +27,8 @@ Canvas | AutoX - - + +

    Canvas

    canvas 提供了使用画布进行 2D 画图的支持,可用于简单的小游戏开发或者图片编辑。使用 canvas 可以轻松地在一张图片或一个界面上绘制各种线与图形。

    canvas 的坐标系为平面直角坐标系,以屏幕左上角为原点,屏幕上边为 x 轴正方向,屏幕左边为 y 轴正方向。例如分辨率为 1920*1080 的屏幕上,画一条从屏幕左上角到屏幕右下角的线段为:

    canvas.drawLine(0, 0, 1080, 1920, paint);
    @@ -47,6 +47,6 @@
     //绘制一个从坐标(0, 0)到坐标(100, 100)的正方形
     canvas.drawRect(0, 0, 100, 100, paint);
     

    结合画笔 canvas 可以绘制基本图形、图片等。

    canvas.drawARGB(a, r, g, b)

    canvas.draw

    - + diff --git a/colors.html b/colors.html index d5a7385..50bc67d 100644 --- a/colors.html +++ b/colors.html @@ -27,13 +27,13 @@ 颜色-colors | AutoX - - + +

    颜色-colors

    稳定

    在 Auto.js 有两种方式表示一个颜色。 一种是使用一个字符串"#AARRGGBB"或"#RRGGBB",其中 AA 是 Alpha 通道(透明度)的值,RR 是 R 通道(红色)的值,GG 是 G 通道(绿色)的值,BB 是 B 通道(蓝色)的值。例如"#ffffff"表示白色, "#7F000000"表示半透明的黑色。 另一种是使用一个 16 进制的"32 位整数" 0xAARRGGBB 来表示一个颜色,例如 0xFF112233表示颜色"#112233", 0x11223344表示颜色"#11223344"。 可以通过colors.toString()把颜色整数转换为字符串,通过colors.parseColor()把颜色字符串解析为颜色整数。

    colors.toString(color)

    • color {number} 整数 RGB 颜色值
    • 返回 {string}

    返回颜色值的字符串,格式为 "#AARRGGBB"。

    colors.red(color)

    • color {number} | {string} 颜色值
    • 返回 {number}

    返回颜色 color 的 R 通道的值,范围 0~255.

    colors.green(color)

    • color {number} | {string} 颜色值
    • 返回 {number}

    返回颜色 color 的 G 通道的值,范围 0~255.

    colors.blue(color)

    • color {number} | {string} 颜色值
    • 返回 {number}

    返回颜色 color 的 B 通道的值,范围 0~255.

    colors.alpha(color)

    • color {number} | {string} 颜色值
    • 返回 {number}

    返回颜色 color 的 Alpha 通道的值,范围 0~255.

    colors.rgb(red, green, blue)

    • red {number} 颜色的 R 通道的值
    • blue {number} 颜色的 G 通道的值
    • green {number} 颜色的 B 通道的值
    • 返回 {number}

    返回这些颜色通道构成的整数颜色值。Alpha 通道将是 255(不透明)。

    colors.argb(alpha, red, green, blue)

    • alpha {number} 颜色的 Alpha 通道的值
    • red {number} 颜色的 R 通道的值
    • green {number} 颜色的 G 通道的值
    • blue {number} 颜色的 B 通道的值
    • 返回 {number}

    返回这些颜色通道构成的整数颜色值。

    colors.parseColor(colorStr)

    • colorStr {string} 表示颜色的字符串,例如"#112233"
    • 返回 {number}

    返回颜色的整数值。

    colors.isSimilar(color2, color2[, threshold, algorithm])

    • color1 {number} | {string} 颜色值 1
    • color1 {number} | {string} 颜色值 2
    • threshold {number} 颜色相似度临界值,默认为 4。取值范围为 0~255。这个值越大表示允许的相似程度越小,如果这个值为 0,则两个颜色相等时该函数才会返回 true。
    • algorithm {string} 颜色匹配算法,默认为"diff", 包括:
      • diff: 差值匹配。与给定颜色的 R、G、B 差的绝对值之和小于 threshold 时匹配。
      • rgb: rgb 欧拉距离相似度。与给定颜色 color 的 rgb 欧拉距离小于等于 threshold 时匹配。
      • rgb+: 加权 rgb 欧拉距离匹配(LAB Delta Eopen in new window)。
      • hs: hs 欧拉距离匹配。hs 为 HSV 空间的色调值。
    • 返回 {Boolean}

    返回两个颜色是否相似。

    colors.equals(color1, color2)

    • color1 {number} | {string} 颜色值 1
    • color1 {number} | {string} 颜色值 2
    • 返回 {Boolean}

    返回两个颜色是否相等。注意该函数会忽略 Alpha 通道的值进行比较

    log(colors.equals("#112233", "#112234"));
     log(colors.equals(0xff112233, 0xff223344));
     

    colors.BLACK

    黑色,颜色值 #FF000000

    colors.DKGRAY

    深灰色,颜色值 #FF444444

    colors.GRAY

    灰色,颜色值 #FF888888

    colors.LTGRAY

    亮灰色,颜色值 #FFCCCCCC

    colors.WHITE

    白色,颜色值 #FFFFFFFF

    colors.RED

    红色,颜色值 #FFFF0000

    colors.GREEN

    绿色,颜色值 #FF00FF00

    colors.BLUE

    蓝色,颜色值 #FF0000FF

    colors.YELLOW

    黄色,颜色值 #FFFFFF00

    colors.CYAN

    青色,颜色值 #FF00FFFF

    colors.MAGENTA

    品红色,颜色值 #FFFF00FF

    colors.TRANSPARENT

    透明,颜色值 #00000000

    - + diff --git a/console.html b/console.html index 1e62624..95fe533 100644 --- a/console.html +++ b/console.html @@ -27,8 +27,8 @@ 控制台-console | AutoX - - + +

    控制台-console

    稳定

    该模块提供了一个和 Web 浏览器中相似的用于调试的控制台。用于输出一些调试信息、中间结果等。

    console.show(autoHide)

    • autoHide {boolean} 当程序结束的时候是否自动隐藏

    显示控制台。需要悬浮窗权限

    console.hide()

    隐藏控制台悬浮窗。

    console.clear()

    清空控制台。

    console.log(...args)

    global
    • args {any}

    打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3)open in new window 中的代替值(参数都会传给 util.format())。

    let  count = 5;
    @@ -55,6 +55,6 @@
     

    console.setLogSize(size)

    v4.2.5+
    • size {number} 字号大小,单位是 dp 或 sp 20 以内比较合适

    设置 log 字号大小。需要在显示控制台之后才能设置,否则空指针

    console.setCanInput(can)

    v4.2.5+
    • can {boolean}

    控制 console 是否可以输入文字

    console.setBackgroud(color)

    v4.2.5+
    • color {string} 颜色值 #AARRGGBB

    设置 console 背景色,需要在显示控制台之后才能设置,否则空指针

    console.setBackgroud("#33ef0000");
     

    console.setMaxLines(maxLines)

    v5.0.2+
    • maxLines {number} 最大行数

    设置 console 显示最大行数,默认-1,不限 ,超出行数系统会清空,从 0 开始显示 不限制,显示列表过长,android 内存又不足,系统会回收 console 的引用,即 console 将不显示。

    console.setMaxLines(500);
     

    console.setBackgroud(color)

    弃用

    console.setBackground(color)

    • color {string} 颜色值 #AARRGGBB

    设置控制台背景色,需要在显示控制台之后才能设置,否则空指针

    - + diff --git a/continuation.html b/continuation.html index a6735f0..f771767 100644 --- a/continuation.html +++ b/continuation.html @@ -27,11 +27,11 @@ 协程 | AutoX - - + + - + diff --git a/coordinatesBasedAutomation.html b/coordinatesBasedAutomation.html index c55e9ec..7b592e1 100644 --- a/coordinatesBasedAutomation.html +++ b/coordinatesBasedAutomation.html @@ -27,8 +27,8 @@ automator | AutoX - - + +

    本章节介绍了一些使用坐标进行点击、滑动的函数。
    要获取要点击的位置的坐标,可以在开发者选项中开启"指针位置"。
    基于坐标的脚本通常会有分辨率的问题,这时可以通过setScreenMetrics()函数来进行自动坐标放缩。 这个函数会影响本章节的所有点击、长按、滑动等函数。通过设定脚本设计时的分辨率,使得脚本在其他分辨率下自动放缩坐标。

    控件和坐标也可以相互结合。一些控件是无法点击的(clickable 为 false), 无法通过.click()函数来点击,这时如果安卓版本在 7.0 以上或者有 root 权限,就可以通过以下方式来点击:

    //获取这个控件
    @@ -69,6 +69,6 @@
       sleep(500);
     }
     

    Tap(x, y)

    • x, y {number} 要点击的坐标。

    点击位置(x, y), 您可以通过"开发者选项"开启指针位置来确定点击坐标。

    Swipe(x1, y1, x2, y2, [duration])

    • x1, y1 {number} 滑动起点的坐标
    • x2, y2 {number} 滑动终点的坐标
    • duration {number} 滑动动作所用的时间

    滑动。从(x1, y1)位置滑动到(x2, y2)位置。

    - + diff --git a/crypto.html b/crypto.html index 21b635c..872b3d5 100644 --- a/crypto.html +++ b/crypto.html @@ -27,8 +27,8 @@ 加密-crypto | AutoX - - + +

    加密-crypto

    稳定

    $crypto 模块提供了对称加密(例如 AES)、非对称加密(例如 RSA)、消息摘要(例如 MD5, SHA)等支持。

    $crypto.Key(data,[options])

    • data {any} 密钥的内容,根据 options.input 指定 data 的数据类型,默认为 string
    • options {Object} 密钥配置 options
    • return {Object} key
      • keyPair 密钥对对象。可以通过$crypto.generateKeyPair函数生成,或通过构造函数构造。
      • data 是 Key 的二进制数据。

    构造函数,构造一个 Key 对象。

    let key = new $crypto.Key("测试");
    @@ -64,6 +64,6 @@
     //从文件读取数据进行摘要
     log("MD5: ", $crypto.digest(file, "MD5", { input: "file" }));
     

    $crypto.encrypt(data, key, algorithm[, options])

    • data {any} 明文消息,根据 options.input 指定的输入类型为不同格式的参数
    • key {Key} 加密密钥。对称加密算法使用单个密钥,非对称加密则需要生成密钥对,参见 Key
    • algorithm {string} 加密算法,包括:
      • AES
      • AES/ECB/NoPadding
      • AES/ECB/PKCS5Padding
      • AES/CBC/NoPadding
      • AES/CBC/PKCS5Padding
      • AES/CFB/NoPadding
      • AES/CFB/PKCS5Padding
      • AES/CTR/NoPadding
      • AES/CTR/PKCS5Padding
      • AES/OFB/PKCS5Padding
      • RSA/ECB/PKCS1Padding
      • RSA/ECB/NoPadding
      • ... 具体可参阅 javax.crypto.Cipheropen in new window
    • options {Object} 用于指定输入与输出的类型与格式 options
    • return {any} 根据options 指定的输出类型返回不同数据

    使用密钥 key 对数据 data 用加密算法 algorithm 进行加密, 数据 data 可以是文件、二进制、base64、hex、字符串等数据,加密后数据可以返回二进制、base64、hex、字符串或者直接写入到文件中,具体参见输入与输出的类型与格式。

    $crypto.decrypt(data, key, algorithm[, options])

    参考 $crypto.encrypt

    对数据进行解密

    options

    • options {object} 用于指定加解密、消息摘要时输入和输出的类型与格式。

      • input {string} 输入类型,若输入字符串,默认为 string;否则认为 bytes。可选的值包括:

        • string 字符串格式的数据
        • base64 base64 格式的数据
        • hex base16 格式的数据
        • bytes Java 二进制字节数组
        • file 文件类型,将参数作为路径,从文件读取数据进行加解密
      • output {string} 输出类型,用于指定加密、解密、摘要后的数据的类型。 对于加解密,默认为 bytes;对于消息摘要,默认为 hex。可选的值包括:

        • string 字符串格式的数据
        • base64 base64 格式的数据
        • hex base16 格式的数据
        • bytes Java 二进制字节数组
        • file 文件类型,将处理后的数据写入到文件中,必须同时制定 dest 参数
      • dest {string} 输出文件路径,output 类型为 file 时,用于指定加密、解密、摘要后输出文件的路径

      • encoding {string} 编码格式,input 类型为 string 时,用于指定输入字符串转为二进制数据所使用的字符编码;output 类型为 string 时,用于指定输出数据转为字符串数据所使用的字符编码。默认为 utf-8

    - + diff --git a/device.html b/device.html index ee9a98d..8b07ea5 100644 --- a/device.html +++ b/device.html @@ -27,8 +27,8 @@ 设备信息-device | AutoX - - + +

    设备信息-device

    稳定

    device

    device 模块提供了与设备有关的信息与操作,例如获取设备宽高,内存使用率,IMEI,调整设备亮度、音量等。

    device.width

    • return {number}

    设备屏幕分辨率宽度。例如 1080。

    device.height

    • return {number}

    设备屏幕分辨率高度。例如 1920。

    device.buildId

    • return {string}

    修订版本号,或者诸如"M4-rc20"的标识。

    device.broad

    • return {string}

    The name of the underlying board, like "goldfish".

    设备的主板(?)型号。

    device.brand

    • return {string}

    The consumer-visible brand with which the product/hardware will be associated, if any.

    与产品或硬件相关的厂商品牌,如"Xiaomi", "Huawei"等。

    device.device

    • return {string}

    The name of the industrial design.

    设备在工业设计中的名称。

    device.model

    • return {string}

    The end-user-visible name for the end product.

    设备型号。

    device.product

    • return {string}

    The name of the overall product.

    整个产品的名称。

    device.bootloader

    • return {string}

    The system bootloader version number.

    设备 Bootloader 的版本。

    device.hardware

    • return {string}

    The name of the hardware (from the kernel command line or /proc).

    设备的硬件名称(来自内核命令行或者/proc)。

    device.fingerprint

    • return {string}

    A string that uniquely identifies this build. Do not attempt to parse this value.

    构建(build)的唯一标识码。

    device.serial

    • return {string}

    A hardware serial number, if available. Alphanumeric only, case-insensitive.

    硬件序列号。

    device.sdkInt

    • return {number}

    The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES.

    安卓系统 API 版本。例如安卓 4.4 的 sdkInt 为 19。

    device.incremental

    • return {string}

    The internal value used by the underlying source control to represent this build. E.g., a perforce changelist number or a git hash.

    device.release

    • return {string}

    The user-visible version string. E.g., "1.0" or "3.4b5".

    Android 系统版本号。例如"5.0", "7.1.1"。

    device.baseOS

    • return {string}

    The base OS build the product is based on.

    device.securityPatch

    • return {string}

    The user-visible security patch level.

    安全补丁程序级别。

    device.codename

    • return {string}

    The current development codename, or the string "REL" if this is a release build.

    开发代号,例如发行版是"REL"。

    device.getIMEI()

    • return {string}

    返回设备的 IMEI.

    device.getAndroidId()

    • return {string}

    返回设备的 Android ID。

    Android ID 为一个用 16 进制字符串表示的 64 位整数,在设备第一次使用时随机生成,之后不会更改,除非恢复出厂设置。

    device.getMacAddress()

    实验
    • return {string}

    返回设备的 Mac 地址。该函数需要在有 WLAN 连接的情况下才能获取,否则会返回 null。

    可能的后续修改:未来可能增加有 root 权限的情况下通过 root 权限获取,从而在没有 WLAN 连接的情况下也能返回正确的 Mac 地址,因此请勿使用此函数判断 WLAN 连接。

    device.getBrightness()

    • return {number}

    返回当前的(手动)亮度。范围为 0~255。

    device.getBrightnessMode()

    • return {number}

    返回当前亮度模式,0 为手动亮度,1 为自动亮度。

    device.setBrightness(b)

    • b {number} 亮度,范围 0~255

    设置当前手动亮度。如果当前是自动亮度模式,该函数不会影响屏幕的亮度。

    此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

    device.setBrightnessMode(mode)

    • mode {number} 亮度模式,0 为手动亮度,1 为自动亮度

    设置当前亮度模式。

    此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

    device.getMusicVolume()

    • return {number} 整数值

    返回当前媒体音量。

    device.getNotificationVolume()

    • return {number} 整数值

    返回当前通知音量。

    device.getAlarmVolume()

    • return {number} 整数值

    返回当前闹钟音量。

    device.getMusicMaxVolume()

    • return {number} 整数值

    返回媒体音量的最大值。

    device.getNotificationMaxVolume()

    • return {number} 整数值

    返回通知音量的最大值。

    device.getAlarmMaxVolume()

    • return {number} 整数值

    返回闹钟音量的最大值。

    device.setMusicVolume(volume)

    • volume {number} 音量

    设置当前媒体音量。

    此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

    device.setNotificationVolume(volume)

    • volume {number} 音量

    设置当前通知音量。

    此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

    device.setAlarmVolume(volume)

    • volume {number} 音量

    设置当前闹钟音量。

    此函数需要"修改系统设置"的权限。如果没有该权限,会抛出 SecurityException 并跳转到权限设置界面。

    device.getBattery()

    • return {number} 0.0~100.0 的浮点数

    返回当前电量百分比。

    device.isCharging()

    • return {boolean}

    返回设备是否正在充电。

    device.getTotalMem()

    • return {number}

    返回设备内存总量,单位字节(B)。1MB = 1024 * 1024B。

    device.getAvailMem()

    • return {number}

    返回设备当前可用的内存,单位字节(B)。

    device.isScreenOn()

    • return {boolean}

    返回设备屏幕是否是亮着的。如果屏幕亮着,返回true; 否则返回false

    需要注意的是,类似于 vivo xplay 系列的息屏时钟不属于"屏幕亮着"的情况,虽然屏幕确实亮着但只能显示时钟而且不可交互,此时isScreenOn()也会返回false

    device.wakeUp()

    唤醒设备。包括唤醒设备 CPU、屏幕等。可以用来点亮屏幕。

    device.wakeUpIfNeeded()

    如果屏幕没有点亮,则唤醒设备。

    device.keepScreenOn([timeout])

    • timeout {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。

    保持屏幕常亮。

    此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。

    在某些设备上,如果不加参数 timeout,只能在 Auto.js 的界面保持屏幕常亮,在其他界面会自动失效,这是因为设备的省电策略造成的。因此,建议使用比较长的时长来代替"一直保持屏幕常亮"的功能,例如device.keepScreenOn(3600 * 1000)

    可以使用device.cancelKeepingAwake()来取消屏幕常亮。

    //一直保持屏幕常亮
    @@ -36,6 +36,6 @@
     

    device.keepScreenDim([timeout])

    • timeout {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。

    保持屏幕常亮,但允许屏幕变暗来节省电量。此函数可以用于定时脚本唤醒屏幕操作,不需要用户观看屏幕,可以让屏幕变暗来节省电量。

    此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。

    可以使用device.cancelKeepingAwake()来取消屏幕常亮。

    device.cancelKeepingAwake()

    取消设备保持唤醒状态。用于取消device.keepScreenOn(), device.keepScreenDim()等函数设置的屏幕常亮。

    device.vibrate(millis)

    • millis {number} 震动时间,单位毫秒

    使设备震动一段时间。

    //震动两秒
     device.vibrate(2000);
     

    device.cancelVibration()

    v4.2.7+

    如果设备处于震动状态,则取消震动。

    device.checkDeviceHasNavigationBar()

    v4.2.7+
    • return {boolean}

    设备是否存储虚拟导航栏

    device.getVirtualBarHeigh()

    v4.2.7+
    • return {number}

    返回导航栏的高度 设备虚拟导航栏的高度,可以用设备高度 减去 这个高度,再按一定比例 点击底部附件的坐标

    - + diff --git a/dialogs.html b/dialogs.html index c108297..c622885 100644 --- a/dialogs.html +++ b/dialogs.html @@ -27,8 +27,8 @@ 对话框-dialogs | AutoX - - + +

    对话框-dialogs

    稳定

    dialogs 模块提供了简单的对话框支持,可以通过对话框和用户进行交互。

    提示

    对话框在 ui 模式下需使用回调函数或者Promiseopen in new window的形式。

    "ui";
    @@ -160,6 +160,6 @@
         toast("对话框显示了");
     }).show();
     
    事件名回调参数描述
    showdialog {Dialog}对话框显示时触发
    canceldialog {Dialog}对话框被取消时触发
    dismissdialog {Dialog}对话框消失时触发
    positivedialog {Dialog}确定按钮按下时触发
    negativedialog {Dialog}取消按钮按下时触发
    neutraldialog {Dialog}中性按钮按下时触发
    anydialog {Dialog}, action {string}任意按钮按下时触发,action可能的值为positivenegativeneutral
    item_selectindex {number}, item {Object}, dialog {Dialog}对话框列表项目被点击选中时触发,itemsSelectMode 为 "select"
    single_choiceindex {number}, item {Object}, dialog {Dialog}对话框单选列表项目被选中并点击确定时触发,itemsSelectMode 为 "single"
    multi_choiceindices {Array}, items {Array}, dialog {Dialog}对话框多选列表项目被选中并点击确定时触发,itemsSelectMode 为 "multi"
    inputtext {string}, dialog {Dialog}带有输入框的对话框点击确定时触发
    input_changetext {string}, dialog {Dialog}对话框的输入框文本发生变化时触发

    Dialog.getProgress()

    • return {number}

    获取当前进度条的进度值,是一个整数

    Dialog.getMaxProgress()

    • return {number}

    获取当前进度条的最大进度值,是一个整数

    Dialog.getActionButton(action)

    • action {string} 动作,包括:
      • positive
      • negative
      • neutral
    - + diff --git a/documentation.html b/documentation.html index 9b17c29..55ff92d 100644 --- a/documentation.html +++ b/documentation.html @@ -27,8 +27,8 @@ 关于本文档 | AutoX - - + +

    关于本文档

    文档中使用一些标签来标记状态:

    • 稳定 一般不会被更改,并且会保证后向兼容性
    • 实验 可能会更改或移除。应该谨慎使用这些函数或模块,或者仅用作临时或试验用途。
    • 弃用 被移除或更改。应该移除对这些函数的使用,以免后续出现意料之外的问题。
    • v4.1.0+ 版本号,代表该函数在某个版本加入
    • Android 7+ 安卓版本,低于此版本无效果
    • Root 基于 Root 运行
    • Accessibility 基于 无障碍 运行
    • global 此函数可全局使用

    开发环境搭建

    插件信息

    名称: Auto.js-Autox.js-VSCodeExtopen in new window
    ID: aaroncheng.auto-js-vsce-fixed
    说明: 用于在pc上vscode中开发autoxjs的自动化脚本的插件。结合webpack自动编译,js自动运行到手机
    版本: 1.110.0
    发布者: aaron cheng

    1.确保您的计算机上安装了 Visual Studio Code,Git ,Node.js。
    2.打开 Visual Studio Code。
    3.点击左侧的扩展图标或按 Ctrl+Shift+X 打开扩展市场。
    4.在搜索框中输入 "aaroncheng.auto-js-vsce-fixed"。
    5.找到插件并进行安装。
    6.下载webpack-autojsopen in new window项目,使用vscode打开项目,在终端中输入以下命令:

    npm i -g webpack webpack-cli --registry=https://registry.npmmirror.com
    @@ -44,6 +44,6 @@
        
     

    我们在 work 目录中新建项目进行开发,编译配置在 scriptConfig.js 中,按照注释修改。
    header.txt 文件内容会原封不动的添加到编译后的js代码头部,可以用来添加注释。
    package.json 文件规定 npm run start 和 npm run build 的命令,无需修改。

    代码开发

    1. 开启服务

      • 在 VSCode 的命令面板中(可以通过按 Ctrl+Shift+P 快捷键打开),输入 开启服务开启服务并监听adb设备 并选择它。
    2. 连接手机

      • 确保您的 Android 设备已经开启 USB 调试模式,手机和电脑处于同一 Wi-Fi 网络下。
      • 在 Auto.js 侧边栏中启用连接电脑,然后输入 VSCode 显示的 IP 地址进行连接。
      • 如果使用 USB 连接,确保手机开启了 USB 调试,并使用数据线连接电脑。VSCode 插件将自动识别连接的设备。

    3: 运行命令

    在 VSCode 的终端中,导航到您的项目目录,然后运行以下命令来启动开发服务器:

    npm run start
     
    • 自动运行

      • 如果 scriptConfig.js 中的 watch 配置设置为 'rerun',每当您保存文件时,VSCode 将自动在连接的 Android 设备上运行最新的脚本。
    • 自动部署

      • 如果 scriptConfig.js 中的 watch 配置设置为 'deploy',每当您保存文件时,VSCode 将自动将重新编译的项目保存到手机中。
    - + diff --git a/engines.html b/engines.html index eadeb50..efa8de4 100644 --- a/engines.html +++ b/engines.html @@ -27,8 +27,8 @@ 脚本引擎-engines | AutoX - - + +

    脚本引擎-engines

    稳定

    engines 模块包含了一些与脚本环境、脚本运行、脚本引擎有关的函数,包括运行其他脚本,关闭脚本等。

    例如,获取脚本所在目录:

    toast(engines.myEngine().cwd());
    @@ -79,6 +79,6 @@
     //向该脚本发送事件
     e.getEngine().emit("say", "你好");
     

    ScriptConfig

    脚本执行时的配置。

    delay

    • return {number}

    延迟执行的毫秒数

    interval

    • return {number}

    循环运行时两次运行之间的时间间隔

    loopTimes

    • return {number}

    循环运行次数

    getPath()

    • return {Array}

    返回一个字符串数组表示脚本运行时模块寻找的路径。

    - + diff --git a/events.html b/events.html index 78e82b7..e59b578 100644 --- a/events.html +++ b/events.html @@ -27,8 +27,8 @@ 事件与监听-events | AutoX - - + +

    事件与监听-events

    稳定

    events 模块提供了监听手机通知、按键、触摸的接口。您可以用他配合自动操作函数完成自动化工作。

    events 本身是一个EventEmiiter, 但内置了一些事件、包括按键事件、通知事件、Toast 事件等。

    需要注意的是,事件的处理是单线程的,并且仍然在原线程执行,如果脚本主体或者其他事件处理中有耗时操作、轮询等,则事件将无法得到及时处理(会进入事件队列等待脚本主体或其他事件处理完成才执行)。例如:

    auto();
    @@ -207,6 +207,6 @@
     //保持脚本运行
     setInterval(() => {}, 1000);
     
    - + diff --git a/files.html b/files.html index 5156378..323a5a8 100644 --- a/files.html +++ b/files.html @@ -27,8 +27,8 @@ 文件系统-files | AutoX - - + +

    文件系统-files

    稳定

    files 模块提供了一些常见的文件处理,包括文件读写、移动、复制、删掉等。

    一次性的文件读写可以直接使用files.read(), files.write(), files.append()等方便的函数,但如果需要频繁读写或随机读写,则使用open()函数打开一个文件对象来操作文件,并在操作完毕后调用close()函数关闭文件。

    files.isFile(path)

    • path {string} 路径
    • return {boolean}

    返回路径 path 是否是文件。

    log(files.isDir("/sdcard/文件夹/")); //返回false
    @@ -62,6 +62,6 @@
     });
     log(jsFiles);
     

    open(path[, mode = "r", encoding = "utf-8", bufferSize = 8192])

    • path {string} 文件路径,例如"/sdcard/1.txt"。
    • mode {string} 文件打开模式,包括:
      • r: 只读文本模式。该模式下只能对文件执行文本读取操作。
      • w: 只写文本模式。该模式下只能对文件执行文本覆盖写入操作。
      • a: 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
      • rw: 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。
        目前暂不支持二进制模式,随机读写模式。
    • encoding {string} 字符编码。
    • bufferSize {number} 文件读写的缓冲区大小。

    打开一个文件。根据打开模式返回不同的文件对象。包括:

    对于"w"模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容;其他模式文件不存在会抛出 FileNotFoundException。

    ReadableTextFile

    可读文件对象。

    ReadableTextFile.read()

    返回该文件剩余的所有内容的字符串。

    ReadableTextFile.read(maxCount)

    • maxCount {Number} 最大读取的字符数量

    读取该文件接下来最长为 maxCount 的字符串并返回。即使文件剩余内容不足 maxCount 也不会出错。

    ReadableTextFile.readline()

    读取一行并返回(不包含换行符)。

    ReadableTextFile.readlines()

    读取剩余的所有行,并返回它们按顺序组成的字符串数组。

    close()

    关闭该文件。

    打开一个文件不再使用时务必关闭

    WritableTextFile

    可写文件对象。

    WritableTextFile.write(text)

    • text {string} 文本

    把文本内容 text 写入到文件中。

    WritableTextFile.writeline(line)

    • text {string} 文本

    把文本 line 写入到文件中并写入一个换行符。

    WritableTextFile.writelines(lines)

    • lines {Array} 字符串数组

    把很多行写入到文件中....

    WritableTextFile.flush()

    把缓冲区内容输出到文件中。

    WritableTextFile.close()

    关闭文件。同时会被缓冲区内容输出到文件。

    打开一个文件写入后,不再使用时务必关闭,否则文件可能会丢失

    - + diff --git a/floaty.html b/floaty.html index cd63c36..60b665a 100644 --- a/floaty.html +++ b/floaty.html @@ -27,8 +27,8 @@ 悬浮窗-floaty | AutoX - - + +

    悬浮窗-floaty

    稳定

    floaty 模块提供了悬浮窗的相关函数,可以在屏幕上显示自定义悬浮窗,并控制悬浮窗的大小、位置等。 在使用 floaty 模块之前,应先检查并获取悬浮窗的权限,否则将无法正常执行悬浮窗相关的代码。检查和获取悬浮窗权限的方法如下:

    floaty.checkPermission()

    v4.2.17+

    检查当前应用是否已经具有悬浮窗权限。

    if (!floaty.checkPermission()) {
    @@ -63,6 +63,6 @@
       w.close();
     }, 2000);
     

    FloatyWindow 和 FloatyRawWindow 对象

    通过使用floaty.window()floaty.rawWindow()函数创建悬浮窗时,将返回一个 FloatyWindowFloatyRawWindow 对象。下文用window简称,这两个对象都具有以下方法:

    window.setPosition(x, y)

    设置悬浮窗的位置。

    • x {number} 悬浮窗的 X 坐标
    • y {number} 悬浮窗的 Y 坐标

    window.getX()

    返回悬浮窗的 X 坐标。

    window.getY()

    返回悬浮窗的 Y 坐标。

    window.setSize(width, height)

    设置悬浮窗的大小。

    • width {number} 悬浮窗的宽度
    • height {number} 悬浮窗的高度

    window.getWidth()

    返回悬浮窗的宽度。

    window.getHeight()

    返回悬浮窗的高度。

    window.close()

    关闭悬浮窗。

    window.exitOnClose()

    设置当悬浮窗关闭时是否自动结束脚本运行。如果将该方法的参数设置为true,则当悬浮窗被关闭时,脚本将自动停止运行。

    window.setAdjustEnabled(enabled)

    设置悬浮窗是否可调整大小和位置。仅FloatyWindow可用

    • enabled {boolean} 是否启用悬浮窗调整(大小、位置)

    window.setTouchable(touchable)

    设置悬浮窗是否可触摸。如果设置为false,则悬浮窗上的触摸、点击等事件将直接传递到悬浮窗下面。仅FloatyRawWindow可用

    • touchable {boolean} 是否可触摸
    - + diff --git a/global.html b/global.html index faa7f9e..5f46354 100644 --- a/global.html +++ b/global.html @@ -27,8 +27,8 @@ 全局对象-global | AutoX - - + +

    全局对象-global

    稳定

    以下的对象是特定于 Auto.js 的。 有些内置对象是 JavaScript 语言本身的一部分,它们也是全局的。

    一些模块中的函数为了使用方便也可以直接全局使用,这些函数在此不再赘述。

    sleep(n)

    • n {number} 毫秒数

    暂停运行 n毫秒的时间。1 秒等于 1000 毫秒。

    currentPackage()

    Accessibility
    • return {string}

    返回最近一次监测到的正在运行的应用的包名,一般可以认为就是当前正在运行的应用的包名。

    此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。

    currentActivity()

    Accessibility
    • return {string}

    返回最近一次监测到的正在运行的 Activity 的名称,一般可以认为就是当前正在运行的 Activity 的名称。

    此函数依赖于无障碍服务,如果服务未启动,则抛出异常并提示用户启动。

    setClip(text)

    • text {string} 文本

    设置剪贴板内容。此剪贴板即系统剪贴板,在一般应用的输入框中"粘贴"既可使用。

    getClip()

    • return {string}

    返回系统剪贴板的内容。

    toast(message)

    • message {string} 要显示的信息

    以气泡显示信息 message 几秒。(具体时间取决于安卓系统,一般都是 2 秒)

    注意

    注意,连续显示多个 toast 时,会排队显示,即使脚本已经结束,toast 可能仍然会显示,记得添加延时,保证气泡消息消失才继续执行:

    var _toast_ = toast;
    @@ -63,6 +63,6 @@
     importClass(org.jsoup.Jsoup);
     log(Jsoup.parse(files.read("./test.html")));
     

    (jsoup 是一个 Java 实现的解析 Html DOM 的库,可以在Jsoupopen in new window下载)

    runtime.loadDex(path)

    • path {string} dex 文件路径

    加载目标 dex 文件,加载成功后将可以使用该 dex 文件的类。

    因为加载 jar 实际上是把 jar 转换为 dex 再加载的,因此加载 dex 文件会比 jar 文件快得多。可以使用 Android SDK 的 build tools 的 dx 工具把 jar 转换为 dex。

    context

    全局变量。一个 android.content.Context 对象。

    注意该对象为 ApplicationContext,因此不能用于界面、对话框等的创建。

    - + diff --git a/gmlkit.html b/gmlkit.html index f751a52..86c0100 100644 --- a/gmlkit.html +++ b/gmlkit.html @@ -27,17 +27,17 @@ ML kit OCR | AutoX - - + + -

    ML kit OCR

    6.3.4+ 实验

    gmlkit.ocr(img, language)

    对给定的图像进行文字识别。

    // 识别中文
    +    

    ML kit OCR

    6.3.4+ 实验

    gmlkit.ocr(img, language)

    对给定的图像进行文字识别。

    // 识别中文
     let result = gmlkit.ocr(img, "zh");
     console.log(result.text);
    -

    gmlkit.ocrText(img, language)

    对给定的图像进行文字识别,并返回识别到的文本字符串。

    • img {Image} 图片
    • Language {String} 识别语言,可选值为:
    • retrun {String} 识别到的文本字符串。
    // 识别中文
    +

    gmlkit.ocrText(img, language)

    对给定的图像进行文字识别,并返回识别到的文本字符串。

    • img {Image} 图片
    • Language {String} 识别语言,可选值为:
    • retrun {String} 识别到的文本字符串。
    // 识别中文
     let result = gmlkit.ocrText(img, "zh");
     console.log(result);
    -

    Result

    表示 Google ML Kit 文字识别返回的结果,有以下几个属性:

    • level {Number} 结果的层级。
    • confidence {Number} 识别结果的置信度。
    • text {String} 识别到的文本。
    • language {String} 识别到的语言。
    • bounds {Rectopen in new window} 文本在图片中的位置
    • children {Array} 子列表,包含更详细的内容。

    Result.find(predicate)

    查找符合条件的第一个元素,没找到则返回 null

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.find(level,predicate)

    查找指定层级中符合条件的第一个元素,没找到则返回 null

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.filter(predicate)

    查找符合条件的所有元素

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.filter(level,predicate)

    在指定层级中查找符合条件的所有元素

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.toArray()

    将结果转换成数组

    • return {Array} Java 数组

    Result.toArray(level)

    将指定层级结果转换成数组

    • level {Number} 层级
    • return {Array} Java 数组

    Result.sort()

    根据bounds的位置对原结果进行排序

    Result.sorted()

    同上,返回排序后的 Result 对象

    • return {Result}

    - +

    Result

    表示 Google ML Kit 文字识别返回的结果,有以下几个属性:

    • level {Number} 结果的层级。
    • confidence {Number} 识别结果的置信度。
    • text {String} 识别到的文本。
    • language {String} 识别到的语言。
    • bounds {Rectopen in new window} 文本在图片中的位置
    • children {Array} 子列表,包含更详细的内容。

    Result.find(predicate)

    查找符合条件的第一个元素,没找到则返回 null

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.find(level,predicate)

    查找指定层级中符合条件的第一个元素,没找到则返回 null

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Result}

    Result.filter(predicate)

    查找符合条件的所有元素

    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.filter(level,predicate)

    在指定层级中查找符合条件的所有元素

    • level {Number} 指定的层级。
    • predicate {Function} 用于判断的函数,接受一个 Result 对象作为参数。
    • return {Array} Java 数组

    Result.toArray()

    将结果转换成数组

    • return {Array} Java 数组

    Result.toArray(level)

    将指定层级结果转换成数组

    • level {Number} 层级
    • return {Array} Java 数组

    Result.sort()

    根据bounds的位置对原结果进行排序

    Result.sorted()

    同上,返回排序后的 Result 对象

    • return {Result}

    paddle

    5.6.1 实验

    paddle.ocr(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocrText(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    OcrResult

    OcrResult 是一个表示 OCR 结果的类。它包含以下字段:

    • confidence {Number} 识别的置信度。
    • preprocessTime {Number} 预处理时间。
    • inferenceTime {Number} 推理时间。
    • text {String} 识别出的文本。
    • bounds {Rectopen in new window} 文本在图像中的位置

    Tessract 6.2.9 实验

    前往 github 下载完整例子:Tessract OCRopen in new window

    + diff --git a/http.html b/http.html index 832b99d..d5f81bc 100644 --- a/http.html +++ b/http.html @@ -27,8 +27,8 @@ 网络请求-http | AutoX - - + +

    网络请求-http

    稳定

    http 模块提供一些进行 http 请求的函数。

    http.get(url[, options, callback])

    • url {string} 请求的 URL 地址,需要以"http://"或"https://"开头。如果 url 没有以"http://"开头,则默认为"http://"。
    • options {Object} 请求选项。参见http.request()
    • callback {Function} 回调函数,可选,其参数是一个Response对象。如果不加回调函数,则该请求将阻塞、同步地执行。

    对地址 url 进行一次 HTTP GET 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应,(参见Response)。

    最简单 GET 请求如下:

    console.show();
    @@ -124,6 +124,6 @@
       console.log("%s: %s", headerName, res.headers[headerName]);
     }
     

    Response.body

    • retrun {Object}

    当前响应的内容。他有以下属性和函数:

    • bytes() {Array} 以字节数组形式返回响应内容
    • string() {string} 以字符串形式返回响应内容
    • json() {Object} 把响应内容作为 JSON 格式的数据并调用 JSON.parse,返回解析后的对象
    • contentType {string} 当前响应的内容类型

    注意,string 和 json 二选一,不能同时使用

    Response.request

    • retrun {Request}

    当前响应所对应的请求。参见[Request][]。

    Response.url

    • retrun {number}

    当前响应所对应的请求 URL。

    Response.method

    • retrun {string}

    当前响应所对应的 HTTP 请求的方法。例如"GET", "POST", "PUT"等。

    - + diff --git a/images.html b/images.html index c865b0a..055c07d 100644 --- a/images.html +++ b/images.html @@ -27,8 +27,8 @@ 图色模块-Images | AutoX - - + +

    图色模块-Images

    稳定

    images 模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。 该模块分为两个部分,找图找色部分和图片处理部分。 需要注意的是,image 对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管 Auto.js 通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。 Image 对象通过调用recycle()函数来回收。例如:

    // 读取图片
    @@ -192,6 +192,6 @@
     });
     log(result.sortBy("top-right"));
     

    Image

    表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。

    Image.recycle()

    释放图片

    Image.getWidth()

    返回以像素为单位图片宽度。

    Image.getHeight()

    返回以像素为单位的图片高度。

    Image.saveTo(path)

    • path {string} 绝对路径

    把图片保存到路径 path。(如果文件存在则覆盖)

    Image.pixel(x, y)

    • x {number} 横坐标
    • y {number} 纵坐标

    返回图片 image 在点(x, y)处的像素的 ARGB 值。 该值的格式为 0xAARRGGBB,是一个"32 位整数"(虽然 JavaScript 中并不区分整数类型和其他数值类型)。
    坐标系以图片左上角为原点。以图片左侧边为 y 轴,上侧边为 x 轴。

    Point

    findColor, findImage 返回的对象。表示一个点(坐标)。

    Point.x

    横坐标。

    Point.y

    纵坐标。

    - + diff --git a/index.html b/index.html index ced0b0c..8817d31 100644 --- a/index.html +++ b/index.html @@ -27,11 +27,11 @@ AutoX - - + +

    AutoX.js

    安卓平台自动化测试软件

    快速开始

    强大且易用

    使用 JavaScript 开发,支持 ES5 和部分 ES6 特性。支持调用Java

    社区支持

    提供了交流社区和应用商店,方便开发者交流和学习。

    功能丰富

    提供了悬浮窗、文件系统、HTTP、WebSocket、图像处理、按键模拟等模块,满足多种自动化需求。

    工程化支持

    结合 webpack 和 VSCode 插件,提供开发、编译、打包、部署、混淆、加密一体化支持。

    网络通信

    支持 HTTP 请求和 WebSocket 通信。

    开源项目

    您可以提交 PR(Pull Request)来修复 bug、添加新功能或改进文档。

    - + diff --git a/keys.html b/keys.html index 9cc3976..67763e1 100644 --- a/keys.html +++ b/keys.html @@ -27,11 +27,11 @@ 按键模拟 | AutoX - - + +

    按键模拟

    稳定

    按键模拟部分提供了一些模拟物理按键的全局函数,包括 Home、音量键、照相键等,有的函数依赖于无障碍服务,有的函数依赖于 root 权限。
    一般来说,以大写字母开头的函数都依赖于 root 权限。执行此类函数时,如果没有 root 权限,则函数执行后没有效果,并会在控制台输出一个警告。

    back()

    无障碍
    • retrun {boolean}

    模拟按下返回键。返回是否执行成功。

    home()

    无障碍
    • retrun {boolean}

    模拟按下 Home 键。返回是否执行成功。

    powerDialog()

    无障碍
    • retrun {boolean}

    弹出电源键菜单。返回是否执行成功。

    notifications()

    无障碍
    • retrun {boolean}

    拉出通知栏。返回是否执行成功。

    quickSettings()

    无障碍
    • retrun {boolean}

    显示快速设置(下拉通知栏到底)。返回是否执行成功。

    recents()

    无障碍
    • retrun {boolean}

    显示最近任务。返回是否执行成功。

    splitScreen()

    无障碍
    • retrun {boolean}

    分屏。返回是否执行成功。
    此函数需要系统自身功能的支持。

    takeScreenshot()

    无障碍 Android 9+
    • retrun {boolean}

    模拟按键 电源键+音量下键 截屏
    不返回截屏得到的图片对象,只返回是否截图成功,图片保存到系统相册

    lockScreen()

    无障碍Android 9+
    • retrun {boolean}

    模拟按键 电源键 锁屏

    dismissNotificationShade()

    无障碍Android 12+
    • retrun {boolean}

    关闭通知栏的操作

    keyCodeHeadsetHook()

    无障碍Android 12+
    • retrun {boolean}

    发送 KEYCODE_HEADSETHOOK KeyEvent 的动作,用于接听/挂断通话和播放/停止媒体

    accessibilityShortcut()

    无障碍Android 12+
    • retrun {boolean}

    触发辅助功能快捷方式的操作。此快捷方式有一个硬件触发器并且可以通过按住两个音量键来激活。

    accessibilityButtonChooser()

    无障碍Android 12+
    • retrun {boolean}

    调出辅助功能按钮的选择器菜单的操作

    accessibilityButton()

    无障碍Android 12+
    • retrun {boolean}

    触发辅助功能按钮的操作

    accessibilityAllApps()

    无障碍Android 12+
    • retrun {boolean}

    显示 Launcher(启动器) 的所有应用的操作。

    Home()

    Root

    模拟按下 Home 键。

    Back()

    Root

    模拟按下返回键。

    Power()

    Root

    模拟按下电源键。

    Root

    模拟按下菜单键。

    VolumeUp()

    Root

    按下音量上键。

    VolumeDown()

    Root

    按键音量上键。

    Camera()

    模拟按下照相键。

    Up()

    Root

    模拟按下物理按键上。

    Down()

    Root

    模拟按下物理按键下。

    Left()

    Root

    模拟按下物理按键左。

    Root

    模拟按下物理按键右。

    OK()

    Root

    模拟按下物理按键确定。

    Text(text)

    • text {string} 要输入的文字,只能为英文或英文符号

    输入文字 text。例如Text("aaa");

    KeyCode(code)

    • code {number} | {String} 要按下的按键的数字代码或名称。KeyCode 对照表
      模拟物理按键。例如KeyCode(29)KeyCode("KEYCODE_A")是按下 A 键。

    附录: KeyCode 对照表

    KeyCodeKeyEvent Value
    KEYCODE_MENU1
    KEYCODE_SOFT_RIGHT2
    KEYCODE_HOME3
    KEYCODE_BACK4
    KEYCODE_CALL5
    KEYCODE_ENDCALL6
    KEYCODE_07
    KEYCODE_18
    KEYCODE_29
    KEYCODE_310
    KEYCODE_411
    KEYCODE_512
    KEYCODE_613
    KEYCODE_714
    KEYCODE_815
    KEYCODE_916
    KEYCODE_STAR17
    KEYCODE_POUND18
    KEYCODE_DPAD_UP19
    KEYCODE_DPAD_DOWN20
    KEYCODE_DPAD_LEFT21
    KEYCODE_DPAD_RIGHT22
    KEYCODE_DPAD_CENTER23
    KEYCODE_VOLUME_UP24
    KEYCODE_VOLUME_DOWN25
    KEYCODE_POWER26
    KEYCODE_CAMERA27
    KEYCODE_CLEAR28
    KEYCODE_A29
    KEYCODE_B30
    KEYCODE_C31
    KEYCODE_D32
    KEYCODE_E33
    KEYCODE_F34
    KEYCODE_G35
    KEYCODE_H36
    KEYCODE_I37
    KEYCODE_J38
    KEYCODE_K39
    KEYCODE_L40
    KEYCODE_M41
    KEYCODE_N42
    KEYCODE_O43
    KEYCODE_P44
    KEYCODE_Q45
    KEYCODE_R46
    KEYCODE_S47
    KEYCODE_T48
    KEYCODE_U49
    KEYCODE_V50
    KEYCODE_W51
    KEYCODE_X52
    KEYCODE_Y53
    KEYCODE_Z54
    KEYCODE_COMMA55
    KEYCODE_PERIOD56
    KEYCODE_ALT_LEFT57
    KEYCODE_ALT_RIGHT58
    KEYCODE_SHIFT_LEFT59
    KEYCODE_SHIFT_RIGHT60
    KEYCODE_TAB61
    KEYCODE_SPACE62
    KEYCODE_SYM63
    KEYCODE_EXPLORER64
    KEYCODE_ENVELOPE65
    KEYCODE_ENTER66
    KEYCODE_DEL67
    KEYCODE_GRAVE68
    KEYCODE_MINUS69
    KEYCODE_EQUALS70
    KEYCODE_LEFT_BRACKET71
    KEYCODE_RIGHT_BRACKET72
    KEYCODE_BACKSLASH73
    KEYCODE_SEMICOLON74
    KEYCODE_APOSTROPHE75
    KEYCODE_SLASH76
    KEYCODE_AT77
    KEYCODE_NUM78
    KEYCODE_HEADSETHOOK79
    KEYCODE_FOCUS80
    KEYCODE_PLUS81
    KEYCODE_MENU82
    KEYCODE_NOTIFICATION83
    KEYCODE_SEARCH84
    TAG_LAST_KEYCODE85
    - + diff --git a/media.html b/media.html index f1103d1..c2b2aff 100644 --- a/media.html +++ b/media.html @@ -27,8 +27,8 @@ 多媒体-media | AutoX - - + +

    多媒体-media

    稳定

    media 模块提供多媒体编程的支持。目前仅支持音乐播放和媒体文件扫描。后续会结合 UI 加入视频播放等功能。

    需要注意是,使用该模块播放音乐时是在后台异步播放的,在脚本结束后会自动结束播放,因此可能需要插入诸如sleep()的语句来使脚本保持运行。例如:

    //播放音乐
    @@ -59,6 +59,6 @@
     //等待音乐播放完成
     sleep(media.getMusicDuration() - 30 * 1000);
     

    media.pauseMusic()

    暂停音乐播放。如果当前没有在播放音乐,则调用函数没有任何效果。

    media.resumeMusic()

    继续音乐播放。如果当前没有播放过音乐,则调用该函数没有任何效果。

    media.stopMusic()

    停止音乐播放。如果当前没有在播放音乐,则调用函数没有任何效果。

    media.isMusicPlaying()

    • return {boolean}

    返回当前是否正在播放音乐。

    media.getMusicDuration()

    • return {number}

    返回当前音乐的时长。单位毫秒。

    media.getMusicCurrentPosition()

    • return {number}

    返回当前音乐的播放进度(已经播放的时间),单位毫秒。

    - + diff --git a/modules.html b/modules.html index f23ea52..1229276 100644 --- a/modules.html +++ b/modules.html @@ -27,8 +27,8 @@ module (模块) | AutoX - - + +

    module (模块) 稳定

    AutoX.js 中的 module 模块是一个遵守 CommonJS 规范的模块系统实现,用于在脚本中加载和导出模块。

    exports

    exports 是一个空对象,用于将模块内的函数、变量和对象导出为模块的公共接口。可以将需要导出的内容直接赋值给 exports 对象的属性,例如:

    // 导出 add 函数
    @@ -40,6 +40,6 @@
       return a + b;
     };
     

    require(id)

    require() 函数用于加载其他模块或 JSON,并返回导出内容。参数 id 是要加载的模块名称或路径,支持相对路径和绝对路径。

    • id {String}

    当加载模块时,会按以下顺序查找文件,直到找到为止:

    1. 当前目录及其子目录 node_modules 文件夹。
    2. 若未找到,则向上查找,直到到达文件系统的根目录
    3. 若还是找不到,则尝试查找 /node_modules/node_libraries 文件夹。
    4. 如果 id 是内置模块的名称,且不存在同名文件,则直接加载内置模块。例如:let console = require('__console__')。Autox.js 还内置了 lodash.js 库。

    如果按确切的文件名没有找到模块,会尝试添加以下拓展名再加载:.js.json

    找不到则作为目录解析,尝试加载以下文件:

    1. 该目录下的 package.json,并根据 package.json 文件中的 main 字段加载指定入口点。例如:如果 package.json 中的 main 字段指定为 'src/index.js',则会加载 id/src/index.js
    2. 如果 package.json 文件不存在或者 main 字段无效,则会默认加载该目录下的 index.js 文件。

    .json 文件被解析为 JSON 文本文件,并返回一个 JavaScript 对象。

    值得注意的是,当存在循环依赖的情况时,可以通过在函数内仅引用需使用的部分进行避免。同时,我们也应该在设计模块之间的依赖时,尽量避免出现循环依赖。

    - + diff --git a/overview.html b/overview.html index 1777f05..ebf4aa1 100644 --- a/overview.html +++ b/overview.html @@ -27,11 +27,11 @@ 综述 | AutoX - - + +

    综述

    由于原作者不再维护 Auto.jsopen in new window,我计划在原来 4.1 版本的基础上继续维护项目,并将原项目命名为 AutoX.jsopen in new window

    欢迎更多开发者参与这个项目的维护与升级。

    这篇文档里有加密相关的内容可能和实际运行情况有冲突,我会逐步完善更新,程序代码,尽可能保持一致。

    AutoX.js 使用 JavaScript 作为脚本语言,目前使用 Rhino 1.7.13open in new window 作为脚本引擎,支持 ES5 与部分 ES6 特性。

    AutoX.js 下载地址

    Github Releasesopen in new window 下载

    AutoX.js 的功能

    模块

    本文档的章节大致上是以模块来划分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。

    "自动操作"的部分又可以大致分为 基于控件open in new window基于坐标open in new window 的操作。

    基于坐标的操作是通过指定具体的屏幕坐标,进行点击,例如 click(100, 200) 等,这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对于一般软件脚本不是很高效,而且需要安卓 7.0 以上或 root 权限才能执行。

    软件类脚本(例如:批量添加联系人、自动提取短信验证码等等)我们推荐采用基于控件的模拟操作,结合通知、按键等达成更好的工作流。

    其他模块主要包括:

    • app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。
    • console: 控制台。记录运行的日志、错误、信息等。
    • device: 设备。获取设备屏幕宽高、系统版本等信息,控制设备音量、亮度等。
    • engines: 脚本引擎。用于启动其他脚本。
    • events: 事件与监听。按键监听,通知监听,触摸监听等。
    • floaty: 悬浮窗。用于显示自定义的悬浮窗。
    • files: 文件系统。文件创建、获取信息、读写。
    • http: HTTP。发送 HTTP 请求,例如 GET, POST 等。
    • websocket: websocket 客户端、服务器端,可以进行主动推送消息
    • images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。
    • keys: 按键模拟。比如音量键、Home 键模拟等。
    • shell: Shell 命令。
    • threads: 多线程支持。
    • ui: UI 界面。用于显示自定义的 UI 界面,和用户交互。

    除此之外,AutoX.js 内置了对 Promiseopen in new window 的支持。

    参与共建

    软件源码open in new window

    文档源码open in new window

    本文档更新稍有滞后,某些模块文档并没写完,希望有开发者共同参与维护!

    不用担心你不懂,我们可以讨论交流!

    欢迎大家 PR ,共同参与开源!

    - + diff --git a/paddle.html b/paddle.html index ee1d2f1..86818dd 100644 --- a/paddle.html +++ b/paddle.html @@ -27,11 +27,11 @@ paddle | AutoX - - + +

    paddle

    5.6.1 实验

    paddle.ocr(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocr(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {Array} 识别结果数组,值为 OcrResult

    paddle.ocrText(image,useSlim)

    使用指定的 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,[cpuThreadNum,useSlim])

    使用指定的 CPU 核心数和 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。默认值:系统的 CPU 核心数
    • useSlim {Boolean} 加载的模型,可选值:
      • true ocr_v2_for_cpu(slim) :快速模型,默认
      • false ocr_v2_for_cpu : 精准模型
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,cpuThreadNum,myModelPath)

    使用指定的 CPU 核心数和自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • cpuThreadNum {Number} 用于执行 OCR 的 CPU 核心数。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    paddle.ocrText(image,myModelPath)

    使用自定义 OCR 模型来执行 OCR。

    • image {Image} 要执行 OCR 的图像。
    • myModelPath {String} 自定义 OCR 模型的绝对路径。
    • return {String} 识别到的文本字符串。

    OcrResult

    OcrResult 是一个表示 OCR 结果的类。它包含以下字段:

    • confidence {Number} 识别的置信度。
    • preprocessTime {Number} 预处理时间。
    • inferenceTime {Number} 推理时间。
    • text {String} 识别出的文本。
    • bounds {Rectopen in new window} 文本在图像中的位置
    - + diff --git a/qa.html b/qa.html index dc07657..be8f393 100644 --- a/qa.html +++ b/qa.html @@ -27,8 +27,8 @@ Q & A | AutoX - - + +

    Q & A

    如何定时运行脚本

    点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持 Auto.js 后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js 没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

    定时任务如何获取外部参数

    如果一个脚本是用 intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的 intent,从而获取外部参数。

    如何把图片和脚本一起打包,或者打包多个脚本

    如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

    点击 Auto.js 的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的 apk 打包图标即可打包一个项目,点击工具栏可以重新配置项目。

    例如,主脚本要读取同一文件夹下的图片 1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录 1.png 图片;ui 中的图片控件要引用同一文件夹的 2.png 图片则为<img src="file://2.png"/>。Auto.js 内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

    如何使打包的应用不显示主界面

    需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:

    "launchConfig": {
    @@ -65,6 +65,6 @@
     	return ret
     }
     

    有关调用 Android 和 Java 的 API 的更多信息,参见 Work with Javaopen in new window

    - + diff --git a/shell.html b/shell.html index a4c2ce3..f8c69e3 100644 --- a/shell.html +++ b/shell.html @@ -27,8 +27,8 @@ shell 函数 | AutoX - - + +

    shell 函数

    稳定

    shell 即 Unix Shell,在类 Unix 系统提供与操作系统交互的一系列命令。

    很多程序可以用来执行 shell 命令,例如终端模拟器。

    在 Auto.js 大致等同于用 adb 执行命令 "adb shell"。

    其实现包括两种方式:

    • 通过java.lang.Runtime.exec执行(shell, Tap, Home 等函数)
    • 通过内嵌终端模拟器执行(RootAutomator, Shell 等对象)

    shell(cmd[, root])

    • cmd {string} 要执行的命令
    • root {Boolean} 是否以 root 权限运行,默认为 false。

    一次性执行命令 cmd, 并返回命令的执行结果。返回对象的其属性如下:

    • code {number} 返回码。执行成功时为 0,失败时为非 0 的数字。
    • result {string} 运行结果(stdout 输出结果)
    • error {string} 运行的错误信息(stderr 输出结果)。例如执行需要 root 权限的命令但没有授予 root 权限会返回错误信息"Permission denied"。

    示例(强制停止微信):

    var result = shell("am force-stop com.tencent.mm", true);
    @@ -69,6 +69,6 @@
     

    列表文件

    ls filepath
     

    例如:

    log(shell("ls /system/bin").result);
     
    - + diff --git a/storages.html b/storages.html index 6904fe2..7d341ec 100644 --- a/storages.html +++ b/storages.html @@ -27,8 +27,8 @@ Storages | AutoX - - + +

    Storages 稳定

    storages 模块提供了保存简单数据、用户配置等的支持。保存的数据除非应用被卸载或者被主动删除,否则会一直保留。

    storages 支持number, boolean, string等数据类型以及把Object, ArrayJSON.stringify序列化存取。

    storages 保存的数据在脚本之间是共享的,任何脚本只要知道 storage 名称便可以获取到相应的数据,因此它不能用于敏感数据的储存。 storages 无法像 Web 开发中 LocalStorage 一样提供根据域名独立的存储,因为脚本的路径随时可能改变。

    storages.create(name)

    • name {string} 本地存储名称

    创建一个本地存储并返回一个Storage对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。

    例如在一个脚本中,创建名称为 ABC 的存储并存入 a=123:

    var storage = storages.create("ABC");
    @@ -37,6 +37,6 @@
     log("a = " + storage.get("a"));
     

    因此,本地存储的名称比较重要,尽量使用含有域名、作者邮箱等唯一信息的名称来避免冲突,例如:

    var storage = storages.create("2732014414@qq.com:ABC");
     

    storages.remove(name)

    • name {string} 本地存储名称

    删除一个本地存储以及他的全部数据。如果该存储不存在,返回 false;否则返回 true。

    Storage

    Storage.get(key[, defaultValue])

    • key {string} 键值
    • defaultValue {any} 可选,默认值

    从本地存储中取出键值为 key 的数据并返回。

    如果该存储中不包含该数据,这时若指定了默认值参数则返回默认值,否则返回 undefined。

    返回的数据可能是任意数据类型,这取决于使用Storage.put保存该键值的数据时的数据类型。

    Storage.put(key, value)

    • key {string} 键值
    • value {any} 值

    把值 value 保存到本地存储中。value 可以是 undefined 以外的任意数据类型。如果 value 为 undefined 则抛出 TypeError。

    存储的过程实际上是使用 JSON.stringify 把 value 转换为字符串再保存,因此 value 必须是可 JSON 化的才能被接受。

    Storage.remove(key)

    • key {string} 键值

    移除键值为 key 的数据。不返回任何值。

    Storage.contains(key)

    • key {string} 键值

    返回该本地存储是否包含键值为 key 的数据。是则返回 true,否则返回 false。

    Storage.clear()

    移除该本地存储的所有数据。不返回任何值。

    - + diff --git a/threads.html b/threads.html index 0e4b047..974344f 100644 --- a/threads.html +++ b/threads.html @@ -27,8 +27,8 @@ 线程-threads | AutoX - - + +

    线程-threads

    实验

    Threads 模块提供了多线程支持,可以启动新线程来运行脚本。

    脚本主线程会等待所有子线程执行完成后才停止执行,因此如果子线程中有死循环,请在必要的时候调用exit()来直接停止脚本或threads.shutDownAll()来停止所有子线程。

    通过threads.start()启动的所有线程会在脚本被强制停止时自动停止。

    由于 JavaScript 自身没有多线程的支持,因此您可能会遇到意料之外的问题。

    threads.start(action)

    • action {Function} 要在新线程执行的函数
    • retrun Thread

    启动一个新线程并执行 action。

    例如:

    threads.start(function () {
    @@ -227,6 +227,6 @@
       toastLog("sum = " + s + ", 当前线程: " + threads.currentThread());
     });
     

    有关线程的其他问题,例如生产者消费者等问题,请用 Java 相关方法解决,例如java.util.concurrent.BlockingQueue

    - + diff --git a/timers.html b/timers.html index 0bf4d97..9d8ef46 100644 --- a/timers.html +++ b/timers.html @@ -27,8 +27,8 @@ Timer - 定时器 | AutoX - - + +

    Timer - 定时器

    稳定

    timers 模块暴露了一个全局的 API,用于在某个未来时间段调用一个预定函数。

    由于定时器函数是全局的,因此使用该 API 无需调用 timers.XXXXX

    Auto.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API,除了它使用了一个不同的内部实现。它是基于 Android Looper-Handler 消息循环机制构建的,其实现机制与 Node.js 近似。

    例如,要在 5 秒后发出消息 "hello":

    setTimeout(function () {
    @@ -55,6 +55,6 @@
       clearInterval(id);
     }, 60 * 1000);
     

    clearTimeout(id)

    • id {number} 一个 setTimeout() 返回的 ID。

    取消一个由 setTimeout() 创建的定时任务。

    clearImmediate(id)

    • id {number} 一个 setImmediate() 返回的 ID。

    取消一个由 setImmediate() 创建的 Immediate 对象。

    - + diff --git a/util.html b/util.html index 083367c..615bcde 100644 --- a/util.html +++ b/util.html @@ -27,8 +27,8 @@ Util | AutoX - - + +

    Util 稳定

    稳定性: 稳定

    The util module is primarily designed to support the needs of Node.js' own internal APIs. However, many of the utilities are useful for application and module developers as well. It can be accessed using:

    const util = require("util");
    @@ -359,6 +359,6 @@
     
     util.log("Timestamped message.");
     

    util.print([...strings])

    稳定性: 弃用: Use console.log() instead.

    Deprecated predecessor of console.log.

    util.puts([...strings])

    稳定性: 弃用: Use console.log() instead.

    Deprecated predecessor of console.log.

    - + diff --git a/webViewAndHtml.html b/webViewAndHtml.html index 5640a2c..43aa90f 100644 --- a/webViewAndHtml.html +++ b/webViewAndHtml.html @@ -27,8 +27,8 @@ WebView 与 HTML | AutoX - - + + - + diff --git a/websocket.html b/websocket.html index 18804f1..91d424e 100644 --- a/websocket.html +++ b/websocket.html @@ -27,8 +27,8 @@ websocket | AutoX - - + +

    websocket 4.2.8 实验

    websocket 模块,采用 okhttp3 实现,本模块中包含了 okhttp3 核心所有的类,下面讲解其基本的使用方法,更多的使用规则,可参考:okhttpopen in new window,这里涉及一些线程安全问题,请学习多线程,生命周期等内容。

    创建 websocket 客户端

    • 创建一个 http client,可以设定 client 是否重连,心跳等功能
    • 创建一个 request 请求对象,采用什么协议 ws 或 wss 、服务器、端口都能内容
    • 设置监听,当 websocket 生命周期内的一些事情。
    • 设置上面的操作以后,打开链接,创建 webSocket 客户端。
    • 用 webSocket 客户端 发送消息 webSocket.send("你好服务器");
    importPackage(Packages["okhttp3"]); //导入包
    @@ -73,6 +73,6 @@
       // 防止主线程退出
     }, 1000);
     

    创建 websocket 服务器端,一样支持,可以参考 okhttp 官网。

    - + diff --git a/widgetsBasedAutomation.html b/widgetsBasedAutomation.html index 36ff021..bec24d9 100644 --- a/widgetsBasedAutomation.html +++ b/widgetsBasedAutomation.html @@ -27,8 +27,8 @@ 基于控件的操作 | AutoX - - + +

    基于控件的操作

    稳定

    基于控件的操作指的是选择屏幕上的控件,获取其信息或对其进行操作。对于一般软件而言,基于控件的操作对不同机型有很好的兼容性;但是对于游戏而言,由于游戏界面并不是由控件构成,无法采用本章节的方法,也无法使用本章节的函数。有关游戏脚本的编写,请参考《基于坐标的操作》。

    基于控件的操作依赖于无障碍服务,因此最好在脚本开头使用auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面。这样的用户体验并不好,因为需要重新运行脚本,后续会加入等待无障碍服务启动并让脚本继续运行的函数。

    您也可以在脚本开头使用"auto";表示这个脚本需要无障碍服务,但是不推荐这种做法,因为这个标记必须在脚本的最开头(前面不能有注释或其他语句、空格等),我们推荐使用auto()函数来确保无障碍服务已启用。

    auto([mode])

    • mode {string} 模式

    检查无障碍服务是否已经启用,如果没有启用则抛出异常并跳转到无障碍服务启用界面;同时设置无障碍模式为 mode。mode 的可选值为:

    • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
    • normal 正常模式,默认。

    如果不加 mode 参数,则为正常模式。

    建议使用auto.waitFor()auto.setMode()代替该函数,因为auto()函数如果无障碍服务未启动会停止脚本;而auto.waitFor()则会在在无障碍服务启动后继续运行。

    示例:

    auto("fast");
    @@ -151,6 +151,6 @@
     //在集合
     var clickableNames = names.find(clickable());
     

    UiCollection.findOne(selector)

    根据选择器 selector 在该控件集合的控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null

    Rect

    UiObject.bounds(), UiObject.boundsInParent()返回的对象。表示一个长方形(范围)。

    Rect.left

    • {number}

    长方形左边界的 x 坐标、

    Rect.right

    • {number}

    长方形右边界的 x 坐标、

    Rect.top

    • {number}

    长方形上边界的 y 坐标、

    Rect.bottom

    • {number}

    长方形下边界的 y 坐标、

    Rect.centerX()

    • retrun {number}

    长方形中点 x 坐标。

    Rect.centerY()

    • retrun {number}

    长方形中点 y 坐标。

    Rect.width()

    • retrun {number}

    长方形宽度。通常可以作为控件宽度。

    Rect.height()

    • retrun {number}

    长方形高度。通常可以作为控件高度。

    Rect.contains(r)

    返回是否包含另一个长方形 r。包含指的是,长方形 r 在该长方形的里面(包含边界重叠的情况)。

    Rect.intersect(r)

    返回是否和另一个长方形相交。

    UiSelector 进阶

    未完待续。

    - + diff --git a/workWithJava.html b/workWithJava.html index 9617764..6fd3dee 100644 --- a/workWithJava.html +++ b/workWithJava.html @@ -27,11 +27,11 @@ WorkWithJava | AutoX - - + + - + diff --git a/zips.html b/zips.html index c39423d..db3d703 100644 --- a/zips.html +++ b/zips.html @@ -27,11 +27,11 @@ 压缩与解压 | AutoX - - + +

    压缩与解压

    zips 模块提供了压缩和解压缩文件的功能,支持多种常见的压缩格式。

    zips.A(type, filePath, dirPath, [password])

    将指定目录中的文件按照指定的格式压缩成文件后储存在指定的路径下。

    • type {string} - 压缩类型,支持的格式包括:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz。
    • filePath {string} - 压缩包存储的路径名称。
    • dirPath {string} - 需要压缩的目录完整路径名称。
    • password {string} - 可选参数,压缩密码。
    • retrun {number} - 压缩结果状态码

    zips.X(filePath, dirPath, [password])

    解压指定的压缩文件包,并将解压后的文件储存在指定的目录下。

    • filePath {string} - 压缩文件的完整路径名称,必须是以下支持的压缩格式之一:zip、7z、bz2、bzip2、tbz2、tbz、gz、gzip、tgz、tar、wim、swm、xz、txz、rar、chm、iso、msi。
    • dirPath {string} - 解压后的文件存储的目录完整路径名称。
    • [password?] {string} - 可选参数,压缩密码。
    • retrun {number} - 解压缩结果状态码

    状态码

    状态码返回值含义
    0压缩/解压缩成功,文件已保存到指定路径
    1压缩/解压缩结束,存在非致命错误(例如某些文件正在被使用,没有被压缩/解压缩)
    2致命错误
    7命令行错误
    8没有足够内存
    255用户中止操作
    其他未知错误
    - +