应用 - APP

app模块提供一系列函数,用于使用其他应用、与其他应用交互。例如发送意图、打开文件、发送邮件等。 同时提供了方便的进阶函数startActivity和sendBroadcast,用他们可完成app模块没有内置的和其他应用的交互。 ## 获取当前版本号|versionCode | 函数名 | 返回值 | 备注 | | ----------------- | ------ | ---------------------------------------- | | app.versionCode() | 整数型 | 当前软件版本号,整数值。例如160, 256等。 | ```javascript 如果在Auto.js中运行则为Auto.js的版本号;在打包的软件中则为打包软件的版本号。 ``` ## 获取当前版本名 |versionName | 函数名 | 返回值 | 备注 | | ----------------- | ------ | -------------------------------------- | | app.versionName() | 字符串 | 当前软件的版本名称,例如"3.0.0 Beta"。 | ```javascript 如果在Auto.js中运行则为Auto.js的版本名称;在打包的软件中则为打包软件的版本名称。 ``` ## 获取Auto.js版本号 |autojs.versionCode | 函数名 | 返回值 | 备注 | | ---------------------- | ------ | --------------------------------------- | | app.autojs.versionCode | 整数型 | Auto.js版本号,整数值。例如160, 256等。 | ## 获取Auto.js版本名 |autojs.versionName | 函数名 | 返回值 | 备注 | | ---------------------- | ------ | ----------------------------------- | | app.autojs.versionName | 字符串 | Auto.js版本名称,例如"3.0.0 Beta"。 | ## 启动应用 {名称} |launchApp | 函数名 | 返回值 | 备注 | | --------------- | -------- | ---------------------- | | app.launchApp() | 布尔型 | 通过应用名称启动应用。 | | **参数名** | **类型** | | | 应用名称 | 字符串 | | ```javascript app.launchApp("Auto.js") 如果该名称对应多个应用,则只启动其中某一个。 该函数也可以作为全局函数使用。 ``` ## 启动应用 {包名} |launch | 函数名 | 返回值 | 备注 | | ------------ | -------- | -------------------- | | app.launch() | 布尔型 | 通过应用包名启动应用 | | **参数名** | **类型** | | | 应用包名 | 字符串 | | ```javascript app.launch("com.tencent.mm"); 该函数也可以作为全局函数使用。launch("com.tencent.mm"); ``` ## 启动应用 {包名} |launchPackage | 函数名 | 返回值 | 备注 | | ------------------- | -------- | -------------------- | | app.launchPackage() | 布尔型 | 通过应用包名启动应用 | | 参数名 | **类型** | | | 应用包名 | 字符串 | | ```javascript app.launchPackage("com.tencent.mm") 相当于app.launch(packageName)。 ``` ## 获取应用包名 |getPackageName | 函数名 | 返回值 | 备注 | | -------------------- | -------- | --------------------------------- | | app.getPackageName() | 字符串 | 获取应用的包名,找不到则返回{null} | | **参数名** | **类型** | | | 应用名称 | 字符串 | | ```javascript var name = getPackageName("QQ"); //返回"com.tencent.mobileqq" 如果该名称对应多个应用,则只返回其中某一个的包名。 该函数也可以作为全局函数使用。 ``` ## 获取应用名称 |app.getAppName | 函数名 | 返回值 | 备注 | | ---------------- | -------- | --------------------------------- | | app.getAppName() | 字符串 | 获取应用的名称。找不到则返回 null | | **参数名** | **类型** | | | 应用包名 | 字符串 | | ```javascript var name = getAppName("com.tencent.mobileqq"); //返回"QQ" 该函数也可以作为全局函数使用。 ``` ## 打开应用设置页 |openAppSetting | 函数名 | 返回值 | 备注 | | -------------------- | -------- | ------------------------ | | app.openAppSetting() | 布尔型 | 打开应用的详情页(设置页) | | **参数名** | **类型** | | | 应用包名 | 字符串 | | ```javascript app.openAppSetting("com.tencent.mobileqq") 该函数也可以作为全局函数使用。 ``` ## 应用查看文件 |viewFile | 函数名 | 返回值 | 备注 | | -------------- | -------- | ---------------------------------------------------------- | | app.viewFile() | | 用其他应用查看文件。文件不存在的情况由查看文件的应用处理。 | | **参数名** | **类型** | | | 文件路径 | 字符串 | | ```javascript app.viewFile("/sdcard/1.txt"); 如果找不出可以查看该文件的应用,则抛出ActivityNotException。 ``` ## 应用编辑文件 |editFile | 函数名 | 返回值 | 备注 | | -------------- | -------- | ---------------------------------------------------------- | | app.editFile() | | 用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。 | | **参数名** | **类型** | | | 文件路径 | 字符串 | | ```javascript app.editFile("/sdcard/1.txt"); 如果找不出可以编辑该文件的应用,则抛出ActivityNotException。 ``` ## 卸载应用 |uninstall | 函数名 | 返回值 | 备注 | | --------------- | -------- | -------------------------------- | | app.uninstall() | | 卸载应用。会弹出卸载应用的提示框 | | **参数名** | **类型** | | | 应用包名 | string | | ```javascript app.uninstall("com.tencent.mobileqq"); //卸载QQ 如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。 ``` ## 打开指定网站 |openUrl | 函数名 | 返回值 | 备注 | | ------------- | -------- | ---------------------------------------------------- | | app.openUrl() | | 用浏览器打开网站url。 | | **参数名** | **类型** | | | 网站的Url | 字符串 | 如果不以"http://"或"https://"开头则默认是"http://"。 | ```javascript app.openUrl("www.baidu.com"); 如果没有安装浏览器应用,则抛出ActivityNotException。 ``` ## 应用发送邮件 |sendEmail | 函数名 | 返回值 | 备注 | | --------------- | -------- | ------------------------------------- | | app.sendEmail() | | 根据选项options调用邮箱应用发送邮件。 | | **参数名** | **类型** | | | {Object} | json对象 | 发送邮件的参数 | - `options` {Object} 发送邮件的参数。包括: - `email` {string} | {Array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示 - `cc` {string} | {Array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示 - `bcc` {string} | {Array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示 - `subject` {string} 邮件主题(标题) - `text` {string} 邮件正文 - `attachment` {string} 附件的路径。 > 如果没有安装邮箱应用,则抛出ActivityNotException。 ```javascript //发送邮件给10086@qq.com和10001@qq.com。 app.sendEmail({ email: ["10086@qq.com", "10001@qq.com"], subject: "这是一个邮件标题", text: "这是邮件正文" }); ``` ## 意图Intent | > Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: > 启动活动(Activity): Activity 表示应用中的一个"屏幕"。例如应用主入口都是一个Activity,应用的功能通常也以Activity的形式独立,例如微信的主界面、朋友圈、聊天窗口都是不同的Activity。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。 > 启动服务(Service): Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。 > 传递广播: 广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。 > 本模块提供了构建Intent的函数(app.intent()), 启动Activity的函数app.startActivity(), 发送广播的函数app.sendBroadcast()。 > 使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。 ### 构造Intent |intent | 函数名 | 返回值 | 备注 | | ------------ | -------- | ---------------------------------- | | app.intent() | 对象 | 根据选项,构造一个意图Intent对象。 | | **参数名** | **类型** | | | 选项 | Object | | - {Object} 选项,包括: - `action` {string} 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions。 - `type` {string} 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。 - `data` {string} 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。 - `category` {Array} 意图的类别。比较少用。参见Categories。 - `packageName` {string} 目标包名 - `className` {string} 目标Activity或Service等组件的名称 - `extras` {Object} 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras。 - `flags` {Array} intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags。 - `root` {Boolea} 是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。 ``` //打开应用来查看图片文件 var i = app.intent({ action: "VIEW", type: "image/png", data: "file:///sdcard/1.png" }); context.startActivity(i); ``` 需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。 但如果有root权限,则在intent的参数加上`"root": true`即可。例如使用root权限跳转到Auto.js的设置界面为: ```javascript app.startActivity({ packageName: "org.autojs.autojs", className: "org.autojs.autojs.ui.settings.SettingsActivity_", root: true }); ``` 另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。 更多信息,请百度[安卓Intent](https://www.baidu.com/s?wd=android Intent)或参考[Android指南: Intent](https://developer.android.com/guide/components/intents-filters.html#Types)。 ### 启动Activity界面 |startActivity | 函数名 | 返回值 | 备注 | | ------------------- | ----------- | ------------------------------------------ | | app.startActivity() | | 启动Activity界面 | | **参数名** | **类型** | | | Activity活动名称 | 字符串/对象 | 可选的值:console日志界面 settings设置界面 | ```javascript app.startActivity("console"); //启动日志界面 特定界面 //启动应用构造页面 var qq = "2732014414"; app.startActivity({ action: "android.intent.action.VIEW", data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qq, packageName: "com.tencent.mobileqq", }); 启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面,在打包应用中运行则会打开打包应用的相应界面。 ``` ### 发送广播 |sendBroadcast | 函数名 | 返回值 | 备注 | | ------------------- | -------- | -------------------------------------- | | app.sendBroadcast() | | 根据选项构造一个Intent,并发送该广播。 | | **参数名** | **类型** | | | 选项 | 对象 | | ### 启动服务 |startService | 函数名 | 返回值 | 备注 | | ------------------ | -------- | -------------------------------------- | | app.startService() | | 根据选项构造一个Intent,并启动该服务。 | | **参数名** | **类型** | | | 选项 | 对象 | | ### 发送特定广播 |sendBroadcast | 函数名 | 返回值 | 备注 | | ------------------- | -------- | ------------------------------------------------------------ | | app.sendBroadcast() | | 发送特定名称的广播 | | **参数名** | **类型** | | | 特定的广播名称 | 字符串 | `inspect_layout_hierarchy` 布局层次分析、`inspect_layout_bounds` 布局范围 | ```javascript app.sendBroadcast("inspect_layout_bounds"); 发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。 ``` ### Intent转换Shell |intentToShell | 函数名 | 返回值 | 备注 | | ------------------- | -------- | ------------------------------------------------------------ | | app.intentToShell() | | 根据选项构造一个Intent,转换为对应的shell的intent命令的参数。 | | **参数名** | **类型** | | | 选项 | 对象 | | ```javascript shell("am start " + app.intentToShell({ packageName: "org.autojs.autojs", className: "org.autojs.autojs.ui.settings.SettingsActivity_" }), true); ``` 参见[intent参数的规范](https://developer.android.com/studio/command-line/adb#IntentSpec)。 ------