autojs


App - 应用

<p>[TOC]</p> <h1>App</h1> <p>app模块提供一系列函数,用于使用其他应用、与其他应用交互。例如发送意图、打开文件、发送邮件等。</p> <p>同时提供了方便的进阶函数startActivity和sendBroadcast,用他们可完成app模块没有内置的和其他应用的交互。</p> <h2>exit()</h2> <p>退出脚本</p> <h2>app.versionCode</h2> <ul> <li>{number}</li> </ul> <p>当前软件版本号,整数值。例如160, 256等。</p> <p>如果在Auto.js中运行则为Auto.js的版本号;在打包的软件中则为打包软件的版本号。</p> <pre><code class="language-javascript">toastLog(app.versionCode);</code></pre> <h2>app.versionName 获取autojs版本名称</h2> <ul> <li>{string}</li> </ul> <p>当前软件的版本名称,例如&quot;3.0.0 Beta&quot;。</p> <p>如果在Auto.js中运行则为Auto.js的版本名称;在打包的软件中则为打包软件的版本名称。</p> <pre><code class="language-javascript">toastLog(app.verionName);</code></pre> <h2>app.autojs.versionCode 获取autojs版本号</h2> <ul> <li>{number}</li> </ul> <p>Auto.js版本号,整数值。例如160, 256等。</p> <h2>app.launchApp(appName) 通过名称打开应用</h2> <ul> <li><code>appName</code> {string} 应用名称</li> </ul> <p>通过应用名称启动应用。如果该名称对应的应用不存在,则返回false; 否则返回true。如果该名称对应多个应用,则只启动其中某一个。 [打开APP 打开软件]</p> <p>该函数也可以作为全局函数使用。</p> <pre><code class="language-javascript">launchApp("Auto.js");</code></pre> <h2>app.launch(packageName) 通过包名打开应用</h2> <ul> <li><code>packageName</code> {string} 应用包名</li> </ul> <p>通过应用包名启动应用。如果该包名对应的应用不存在,则返回false;否则返回true。</p> <p>该函数也可以作为全局函数使用。</p> <pre><code class="language-javascript">//启动微信 launch("com.tencent.mm");</code></pre> <h2>app.launchPackage(packageName) 通过包名打开应用</h2> <ul> <li><code>packageName</code> {string} 应用包名</li> </ul> <p>相当于<code>app.launch(packageName)</code>。</p> <h2>app.getPackageName(appName) 获取对应应用名称的包名</h2> <ul> <li><code>appName</code> {string} 应用名称</li> </ul> <p>获取应用名称对应的已安装的应用的包名。如果该找不到该应用,返回null;如果该名称对应多个应用,则只返回其中某一个的包名。</p> <p>该函数也可以作为全局函数使用。</p> <pre><code class="language-javascript">var name = getPackageName("QQ"); //返回"com.tencent.mobileqq"</code></pre> <h2>app.getAppName(packageName) 获取对应包名的应用名称 获取包名 获取应用名称</h2> <ul> <li><code>packageName</code> {string} 应用包名</li> </ul> <p>获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回null。</p> <p>该函数也可以作为全局函数使用。</p> <pre><code class="language-javascript">var name = getAppName("com.tencent.mobileqq"); //返回"QQ"</code></pre> <h2>app.openAppSetting(packageName) 打开应用详情页(设置)</h2> <ul> <li><code>packageName</code> {string} 应用包名</li> </ul> <p>打开应用的详情页(设置页)。如果找不到该应用,返回false; 否则返回true。</p> <p>该函数也可以作为全局函数使用。</p> <h2>app.viewFile(path) 用其他应用打开文件</h2> <ul> <li><code>path</code> {string} 文件路径</li> </ul> <p>用其他应用查看文件。文件不存在的情况由查看文件的应用处理。</p> <p>如果找不出可以查看该文件的应用,则抛出<code>ActivityNotException</code>。</p> <pre><code class="language-javascript">//查看文本文件 app.viewFile("/sdcard/1.txt");</code></pre> <h2>app.editFile(path) 用其他应用编辑文件</h2> <ul> <li><code>path</code> {string} 文件路径</li> </ul> <p>用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。</p> <p>如果找不出可以编辑该文件的应用,则抛出<code>ActivityNotException</code>。</p> <pre><code class="language-javascript">//编辑文本文件 app.editFile("/sdcard/1.txt/);</code></pre> <h2>app.uninstall(packageName) 卸载应用</h2> <ul> <li><code>packageName</code> {string} 应用包名</li> </ul> <p>卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出&quot;未找到应用&quot;的提示。</p> <pre><code class="language-javascript">//卸载QQ app.uninstall("com.tencent.mobileqq");</code></pre> <h2>app.openUrl(url) 打开网页</h2> <ul> <li><code>url</code> {string} 网站的Url,如果不以&quot;<a href="http://"或"https://"开头则默认是"http">http://"或"https://"开头则默认是"http</a>://&quot;。</li> </ul> <p>用浏览器打开网站url。</p> <p>如果没有安装浏览器应用,则抛出<code>ActivityNotException</code>。</p> <h2>app.sendEmail(options) 发送邮件</h2> <ul> <li><code>options</code> {Object} 发送邮件的参数。包括: <ul> <li><code>email</code> {string} | {Array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示</li> <li><code>cc</code> {string} | {Array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示</li> <li><code>bcc</code> {string} | {Array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示</li> <li><code>subject</code> {string} 邮件主题(标题)</li> <li><code>text</code> {string} 邮件正文</li> <li><code>attachment</code> {string} 附件的路径。</li> </ul></li> </ul> <p>根据选项options调用邮箱应用发送邮件。这些选项均是可选的。</p> <p>如果没有安装邮箱应用,则抛出<code>ActivityNotException</code>。</p> <pre><code class="language-javascript">//发送邮件给10086@qq.com和10001@qq.com。 app.sendEmail({ email: ["10086@qq.com", "10001@qq.com"], subject: "这是一个邮件标题", text: "这是邮件正文" });</code></pre> <h2>app.startActivity(name) 打开活动</h2> <ul> <li><code>name</code> {string} 活动名称,可选的值为: <ul> <li><code>console</code> 日志界面</li> <li><code>settings</code> 设置界面</li> </ul></li> </ul> <p>启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面,在打包应用中运行则会打开打包应用的相应界面。</p> <pre><code class="language-javascript">app.startActivity("console");</code></pre> <h1>进阶: 意图Intent</h1> <p>Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:</p> <ul> <li> <p>启动活动(Activity): Activity 表示应用中的一个&quot;屏幕&quot;。例如应用主入口都是一个Activity,应用的功能通常也以Activity的形式独立,例如微信的主界面、朋友圈、聊天窗口都是不同的Activity。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。</p> </li> <li> <p>启动服务(Service): Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。</p> </li> <li>传递广播: 广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。</li> </ul> <p>本模块提供了构建Intent的函数(<code>app.intent()</code>), 启动Activity的函数<code>app.startActivity()</code>, 发送广播的函数<code>app.sendBroadcast()</code>。</p> <p>使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。</p> <pre><code class="language-javascript">var qq = "2732014414"; app.startActivity({      action: "android.intent.action.VIEW",      data:"mqq://im/chat?chat_type=wpa&amp;version=1&amp;src_type=web&amp;uin=" + qq,      packageName: "com.tencent.mobileqq",  }); </code></pre> <h2>app.intent(options)</h2> <ul> <li> <p><code>options</code> {Object} 选项,包括:</p> <ul> <li> <p><code>action</code> {string} 意图的Action,指意图要完成的动作,是一个字符串常量,比如&quot;android.intent.action.SEND&quot;。当action以&quot;android.intent.action&quot;开头时,可以省略前缀,直接用&quot;SEND&quot;代替。参见<a href="https://developer.android.com/reference/android/content/Intent.html#standard-activity-actions">Actions</a>。</p> </li> <li> <p><code>type</code> {string} 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如&quot;text/plain&quot;为纯文本类型。</p> </li> <li> <p><code>data</code> {string} 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为&quot;android.intent.action.VIEW&quot;, data为&quot;file:///sdcard/1.txt&quot;。</p> </li> <li> <p><code>category</code> {Array} 意图的类别。比较少用。参见<a href="https://developer.android.com/reference/android/content/Intent.html#standard-categories">Categories</a>。</p> </li> <li> <p><code>packageName</code> {string} 目标包名</p> </li> <li> <p><code>className</code> {string} 目标Activity或Service等组件的名称</p> </li> <li> <p><code>extras</code> {Object} 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见<a href="https://developer.android.com/reference/android/content/Intent.html#standard-extra-data">Extras</a>。</p> </li> <li> <p><code>flags</code> {Array} intent的标识,字符串数组,例如<code>["activity_new_task", "grant_read_uri_permission"]</code>。参见<a href="https://developer.android.com/reference/android/content/Intent.html#setFlags%28int%29">Flags</a>。</p> <p><strong>[v4.1.0新增]</strong></p> </li> <li> <p><code>root</code> {Boolea} 是否以root权限启动、发送该intent。使用该参数后,不能使用<code>context.startActivity()</code>等方法,而应该直接使用诸如<code>app.startActivity({...})</code>的方法。</p> <p><strong>[v4.1.0新增]</strong></p> </li> </ul> </li> </ul> <p>根据选项,构造一个意图Intent对象。</p> <p>例如:</p> <pre><code class="language-javascript">//打开应用来查看图片文件 var i = app.intent({ action: "VIEW", type: "image/png", data: "file:///sdcard/1.png" }); context.startActivity(i);</code></pre> <p>需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。</p> <p>但如果有root权限,则在intent的参数加上<code>"root": true</code>即可。例如使用root权限跳转到Auto.js的设置界面为:</p> <pre><code class="language-javascript">app.startActivity({ packageName: "org.autojs.autojs", className: "org.autojs.autojs.ui.settings.SettingsActivity_", root: true });</code></pre> <p>另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如&quot;intent记录&quot;,&quot;隐式启动&quot;等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。</p> <p>更多信息,请百度<a href="https://www.baidu.com/s?wd=android%20Intent">安卓Intent</a>或参考<a href="https://developer.android.com/guide/components/intents-filters.html#Types">Android指南: Intent</a>。</p> <h2>app.startActivity(options) 打开活动</h2> <ul> <li><code>options</code> {Object} 选项</li> </ul> <p>根据选项构造一个Intent,并启动该Activity。</p> <pre><code class="language-javascript">app.startActivity({ action: "SEND", type: "text/plain", data: "file:///sdcard/1.txt" });</code></pre> <h2>app.sendBroadcast(options) 发送广播</h2> <ul> <li><code>options</code> {Object} 选项</li> </ul> <p>根据选项构造一个Intent,并发送该广播。</p> <h2>app.startService(options) 打开服务</h2> <ul> <li><code>options</code> {Object} 选项</li> </ul> <p>根据选项构造一个Intent,并启动该服务。</p> <h2>app.sendBroadcast(name) 发送广播</h2> <p><strong>[v4.1.0新增]</strong></p> <ul> <li><code>name</code> {string} 特定的广播名称,包括: <ul> <li><code>inspect_layout_hierarchy</code> 布局层次分析</li> <li><code>inspect_layout_bounds</code> 布局范围</li> </ul></li> </ul> <p>发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。</p> <pre><code class="language-javascript">app.sendBroadcast("inspect_layout_bounds");</code></pre> <h2>app.intentToShell(options)</h2> <p><strong>[v4.1.0新增]</strong></p> <ul> <li><code>options</code> {Object} 选项</li> </ul> <p>根据选项构造一个Intent,转换为对应的shell的intent命令的参数。</p> <p>例如: </p> <pre><code class="language-javascript">shell("am start " + app.intentToShell({ packageName: "org.autojs.autojs", className: "org.autojs.autojs.ui.settings.SettingsActivity_" }), true);</code></pre> <p>参见<a href="https://developer.android.com/studio/command-line/adb#IntentSpec">intent参数的规范</a>。</p> <h2>app.parseUri(uri) 解析url</h2> <p><strong>[v4.1.0新增]</strong></p> <ul> <li><code>uri</code> {string} 一个代表Uri的字符串,例如&quot;file:///sdcard/1.txt&quot;, &quot;<a href="https://www.autojs.org">https://www.autojs.org</a>&quot;</li> <li>返回 {Uri} 一个代表Uri的对象,参见<a href="https://developer.android.com/reference/android/net/Uri">android.net.Uri</a>。</li> </ul> <p>解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回<code>null</code>。</p> <p>需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件<code>file://...</code>,返回的Uri会是诸如<code>content://...</code>的形式。</p> <h2>app.getUriForFile(path)</h2> <p><strong>[v4.1.0新增]</strong></p> <ul> <li><code>path</code> {string} 文件路径,例如&quot;/sdcard/1.txt&quot;</li> <li>返回 {Uri} 一个指向该文件的Uri的对象,参见<a href="https://developer.android.com/reference/android/net/Uri">android.net.Uri</a>。</li> </ul> <p>从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如<code>content://...</code>的形式。</p> <h2>app.getInstalledApps([options])</h2> <p><strong> [<a href="https://pro.autojs.org/">Pro 8.0.0新增</a>] </strong></p> <ul> <li><code>options</code> {Object} 选项,包括: <ul> <li><code>get</code>: 指定返回的应用信息中包含的信息 <ul> <li><code>"activities"</code> 应用的Activity组件信息</li> <li><code>"configurations"</code> 应用的硬件配置</li> <li><code>"gids"</code> 应用的group id</li> <li><code>"instrumentation"</code> 应用的Instrumentation信息</li> <li><code>"intent_filters"</code> 应用的意图过滤</li> <li><code>"meta_data"</code> 应用的元信息(默认)</li> <li><code>"permissions"</code> 应用的权限信息</li> <li><code>"providers"</code> 应用的ContentProvider组件信息</li> <li><code>"receivers"</code> 应用的BroadcastReceiver组件信息</li> <li><code>"services"</code> 应用的Service组件信息</li> <li><code>"shared_library_files"</code> 应用的动态链接库文件信息</li> <li><code>"signatures"</code> 应用的签名信息(已弃用</li> <li><code>"signing_certificates"</code> 应用的签名信息</li> <li><code>"uri_permission_patterns"</code></li> <li><code>"disabled_components"</code> 被卸载的但保留了数据的应用</li> <li><code>"disabled_until_used_components"</code> 禁用直到被使用的组件</li> <li><code>"uninstalled_packages"</code> 被卸载的但保留了数据的应用</li> </ul></li> <li><code>match</code>: 指定要匹配的应用列表 <ul> <li><code>"uninstalled_packages"</code> 被卸载的但保留了数据的应用</li> <li><code>"disabled_components"</code> 被禁用的组件</li> <li><code>"disabled_until_used_components"</code> 禁用直到被使用的组件</li> <li><code>"system_only"</code> 只匹配系统应用</li> <li><code>"factory_only"</code> 只匹配预装应用</li> <li><code>"apex"</code> APEX应用</li> </ul></li> </ul></li> <li>返回 {Array\&lt;ApplicationInfo>}</li> </ul> <p>返回为当前用户安装的所有应用程序包的列表。如果设置了match选项 <code>uninstalled_packages</code>,则包括被删除但保留了数据的应用程序。 获取安装的应用列表。</p> <p>返回值是ApplicationInfo对象的数组。 如果没有安装任何应用,则返回一个空数组。 </p> <p>选项options的match选项用于指定要返回哪些应用程序,get选项用于指定返回的应用程序携带哪些信息。</p> <pre><code class="language-javascript">let apps = $app.getInstalledApps({ matcg })</code></pre>

页面列表

ITEM_HTML