应用 - App
# App
app模块提供一系列函数,用于使用其他应用、与其他应用交互。例如发送意图、打开文件、发送邮件等。
同时提供了方便的进阶函数startActivity和sendBroadcast,用他们可完成app模块没有内置的和其他应用的交互。
## 获取当前版本号|versionCode
| 函数名 | 返回值 | 备注 |
| ----------------- | ------ | ---------------------------------------- |
| app.versionCode() | 整数型 | 当前软件版本号,整数值。例如160, 256等。 |
app.versionCode
* {number}
当前软件版本号,整数值。例如160, 256等。
如果在Auto.js中运行则为Auto.js的版本号;在打包的软件中则为打包软件的版本号。
```
toastLog(app.versionCode);
```
## 获取当前版本名 |versionName
| 函数名 | 返回值 | 备注 |
| ----------------- | ------ | -------------------------------------- |
| app.versionName() | 字符串 | 当前软件的版本名称,例如\"3.0.0 Beta\"。 |
app.versionName
* {string}
当前软件的版本名称,例如"3.0.0 Beta"。
如果在Auto.js中运行则为Auto.js的版本名称;在打包的软件中则为打包软件的版本名称。
```
toastLog(app.versionName);
```
## 获取Auto.js版本号 |autojs.versionCode
| 函数名 | 返回值 | 备注 |
| ---------------------- | ------ | --------------------------------------- |
| app.autojs.versionCode | 整数型 | Auto.js版本号,整数值。例如160, 256等。 |
app.autojs.versionCode
* {number}
Auto.js版本号,整数值。例如160, 256等。
## 获取Auto.js版本名 |autojs.versionName
| 函数名 | 返回值 | 备注 |
| ---------------------- | ------ | ----------------------------------- |
| app.autojs.versionName | 字符串 | Auto.js版本名称,例如\"3.0.0 Beta\"。 |
app.autojs.versionName
* {string}
Auto.js版本名称,例如"3.0.0 Beta"。
## 启动应用(名称) |launchApp
| 函数名 | 返回值 | 备注 |
| --------------- | -------- | ---------------------- |
| app.launchApp() | 布尔型 | 通过应用名称启动应用。 |
| **参数名** | **类型** | |
| 应用名称 | 字符串 | |
app.launchApp(appName)
* `appName` {string} 应用名称
通过应用名称启动应用。如果该名称对应的应用不存在,则返回false; 否则返回true。如果该名称对应多个应用,则只启动其中某一个。
该函数也可以作为全局函数使用。
```
launchApp("Auto.js");
```
```js
//启动APP
if (currentPackage() != "com.chaoxing.mobile") {
toast("即将打开超星!");
//直接打开学习通
app.launchApp("学习通");
} else {
toast("已经在学习通中,即将开始进行下一步操作!");
};
```
## 启动应用(包名) |launch
| 函数名 | 返回值 | 备注 |
| ------------ | -------- | -------------------- |
| app.launch() | 布尔型 | 通过应用包名启动应用 |
| **参数名** | **类型** | |
| 应用包名 | 字符串 | |
app.launch(packageName)
* `packageName` {string} 应用包名
通过应用包名启动应用。如果该包名对应的应用不存在,则返回false;否则返回true。
该函数也可以作为全局函数使用。
```
//启动微信
launch("com.tencent.mm");
```
## 启动应用(包名) |launchPackage
| 函数名 | 返回值 | 备注 |
| ------------------- | -------- | -------------------- |
| app.launchPackage() | 布尔型 | 通过应用包名启动应用 |
| 参数名 | **类型** | |
| 应用包名 | 字符串 | |
app.launchPackage(packageName)
* `packageName` {string} 应用包名
相当于`app.launch(packageName)`。
```js
while (true) {
if (currentPackage() != "com.chaoxing.mobile") {
toast("即将打开超星!");
//直接打开学习通
app.launchPackage("com.chaoxing.mobile");
sleep(5000)
} else {
toast("已经在学习通中,即将开始进行下一步操作!");
break;
};
};
```
## 获取应用包名(应用名称) |getPackageName
| 函数名 | 返回值 | 备注 |
| -------------------- | -------- | --------------------------------- |
| app.getPackageName() | 字符串 | 获取应用的包名,找不到则返回{null} |
| **参数名** | **类型** | |
| 应用名称 | 字符串 | |
app.getPackageName(appName)
* `appName` {string} 应用名称
获取应用名称对应的已安装的应用的包名。如果该找不到该应用,返回null;如果该名称对应多个应用,则只返回其中某一个的包名。
该函数也可以作为全局函数使用。
```
var name = getPackageName("QQ"); //返回"com.tencent.mobileqq"
```
## 获取应用名称(应用包名) |getAppName
| 函数名 | 返回值 | 备注 |
| ---------------- | -------- | --------------------------------- |
| app.getAppName() | 字符串 | 获取应用的名称。找不到则返回 null |
| **参数名** | **类型** | |
| 应用包名 | 字符串 | |
app.getAppName(packageName)
* `packageName` {string} 应用包名
获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回null。
该函数也可以作为全局函数使用。
```
var name = getAppName("com.tencent.mobileqq"); //返回"QQ"
```
## 打开应用设置页 |openAppSetting
| 函数名 | 返回值 | 备注 |
| -------------------- | -------- | ------------------------ |
| app.openAppSetting() | 布尔型 | 打开应用的详情页(设置页) |
| **参数名** | **类型** | |
| 应用包名 | 字符串 | |
app.openAppSetting(packageName)
* `packageName` {string} 应用包名
打开应用的详情页(设置页)。如果找不到该应用,返回false; 否则返回true。
该函数也可以作为全局函数使用。
## 应用查看文件 |viewFile
| 函数名 | 返回值 | 备注 |
| -------------- | -------- | ---------------------------------------------------------- |
| app.viewFile() | | 用其他应用查看文件。文件不存在的情况由查看文件的应用处理。 |
| **参数名** | **类型** | |
| 文件路径 | 字符串 | |
app.viewFile(path)
* `path` {string} 文件路径
用其他应用查看文件。文件不存在的情况由查看文件的应用处理。
如果找不出可以查看该文件的应用,则抛出`ActivityNotException`。
```
//查看文本文件
app.viewFile("/sdcard/1.txt");
```
## 应用编辑文件 |editFile
| 函数名 | 返回值 | 备注 |
| -------------- | -------- | ---------------------------------------------------------- |
| app.editFile() | | 用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。 |
| **参数名** | **类型** | |
| 文件路径 | 字符串 | |
app.editFile(path)
* `path` {string} 文件路径
用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。
如果找不出可以编辑该文件的应用,则抛出`ActivityNotException`。
```
//编辑文本文件
app.editFile("/sdcard/1.txt/);
```
## 卸载应用 |uninstall
| 函数名 | 返回值 | 备注 |
| --------------- | -------- | -------------------------------- |
| app.uninstall() | | 卸载应用。会弹出卸载应用的提示框 |
| **参数名** | **类型** | |
| 应用包名 | string | |
app.uninstall(packageName)
* `packageName` {string} 应用包名
卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。
```
//卸载QQ
app.uninstall("com.tencent.mobileqq");
```
## 打开指定网站 |openUrl
| 函数名 | 返回值 | 备注 |
| ------------- | -------- | ---------------------------------------------------- |
| app.openUrl() | | 用浏览器打开网站url。 |
| **参数名** | **类型** | |
| 网站的Url | 字符串 | 如果不以\"http://\"或\"https://\"开头则默认是\"http://\"。 |
app.openUrl(url)
* `url` {string} 网站的Url,如果不以"http://"或"https://"开头则默认是"http://"。
用浏览器打开网站url。
如果没有安装浏览器应用,则抛出`ActivityNotException`。
```
//创建选项菜单(右上角)
ui.emitter.on("create_options_menu", menu => {
menu.add("日志");
menu.add("官网");
menu.add("关于");
});
//监听选项菜单点击
ui.emitter.on("options_item_selected", (e, item) => {
switch (item.getTitle()) {
case "日志":
app.startActivity('console');
break;
case "官网":
app.openUrl("http://www.baidu.com");
break;
case "关于":
alert("信息框标题", '我是内容\n\r提示信息');
break;
}
e.consumed = true;
});
```
## 应用发送邮件 |sendEmail
| 函数名 | 返回值 | 备注 |
| --------------- | -------- | ------------------------------------- |
| app.sendEmail() | | 根据选项options调用邮箱应用发送邮件。 |
| **参数名** | **类型** | |
| {Object} | json对象 | 发送邮件的参数 |
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: "这是一个邮件标题",
text: "这是邮件正文"
});
```
## app.startActivity(name)
* `name` {string} 活动名称,可选的值为:
* `console` 日志界面
* `settings` 设置界面
启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面,在打包应用中运行则会打开打包应用的相应界面。
```
app.startActivity("console");
```
# 进阶: 意图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号的聊天窗口等。
```
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",
});
```
## 构造Intent |intent
| 函数名 | 返回值 | 备注 |
| ------------ | -------- | ---------------------------------- |
| app.intent() | 对象 | 根据选项,构造一个意图Intent对象。 |
| **参数名** | **类型** | |
| 选项 | Object | |
app.intent(options)
* `options` {Object} 选项,包括:
* `action` {string} 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见[Actions](https://developer.android.com/reference/android/content/Intent.html#standard-activity-actions)。
* `type` {string} 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
* `data` {string} 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
* `category` {Array} 意图的类别。比较少用。参见[Categories](https://developer.android.com/reference/android/content/Intent.html#standard-categories)。
* `packageName` {string} 目标包名
* `className` {string} 目标Activity或Service等组件的名称
* `extras` {Object} 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见[Extras](https://developer.android.com/reference/android/content/Intent.html#standard-extra-data)。
* `flags` {Array} intent的标识,字符串数组,例如`["activity_new_task", "grant_read_uri_permission"]`。参见[Flags](https://developer.android.com/reference/android/content/Intent.html#setFlags%28int%29)。
**[v4.1.0新增]**
* `root` {Boolean} 是否以root权限启动、发送该intent。使用该参数后,不能使用`context.startActivity()`等方法,而应该直接使用诸如`app.startActivity({...})`的方法。
**[v4.1.0新增]**
根据选项,构造一个意图Intent对象。
例如:
```
//打开应用来查看图片文件
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的设置界面为:
```
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%20Intent)或参考[Android指南: Intent](https://developer.android.com/guide/components/intents-filters.html#Types)。
```
var intent = new Intent();
// 跳转打电话
// Intent = {
// action: "android.intent.action.DIAL",
// data: "tel:15012345678"
// }
// app.startActivity(Intent)
//intent.setAction("android.settings.ACCESSIBILITY_SETTINGS");
//辅助功能
//intent.setAction("android.settings.ADD_ACCOUNT_SETTINGS");
//添加账户
//intent.setAction("android.settings.AIRPLANE_MODE_SETTINGS");
//系统设置首页
//intent.setAction("android.settings.APN_SETTINGS");
//APN设置
//intent.setAction("android.settings.APPLICATION_SETTINGS");
//应用管理
//intent.setAction("android.settings.BATTERY_SAVER_SETTINGS");
//节电助手
//intent.setAction("android.settings.BLUETOOTH_SETTINGS");
//蓝牙
//intent.setAction("android.settings.CAPTIONING_SETTINGS");
//字幕
//intent.setAction("android.settings.CAST_SETTINGS");
//无线显示
//intent.setAction("android.settings.DATA_ROAMING_SETTINGS");
//移动网络
//intent.setAction("android.settings.DATE_SETTINGS");
//日期和时间设置
//intent.setAction("android.settings.DEVICE_INFO_SETTINGS");
//关于手机
//intent.setAction("android.settings.DISPLAY_SETTINGS");
//显示设置
//intent.setAction("android.settings.DREAM_SETTINGS");
//互动屏保设置
//intent.setAction("android.settings.HARD_KEYBOARD_SETTINGS");
//实体键盘
//intent.setAction("android.settings.HOME_SETTINGS");
//应用权限,默认应用设置,特殊权限
//intent.setAction("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS");
//忽略电池优化设置
//intent.setAction("android.settings.INPUT_METHOD_SETTINGS");
//可用虚拟键盘设置
//intent.setAction("android.settings.INPUT_METHOD_SUBTYPE_SETTINGS");
//安卓键盘语言设置(AOSP)
//intent.setAction("android.settings.INTERNAL_STORAGE_SETTINGS");
//内存和存储
//intent.setAction("android.settings.LOCALE_SETTINGS");
//语言偏好设置
//intent.setAction("android.settings.LOCATION_SOURCE_SETTINGS");
//定位服务设置
//intent.setAction("android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS");
//所有应用
//intent.setAction("android.settings.MANAGE_APPLICATIONS_SETTINGS");
//应用管理
//intent.setAction("android.settings.MANAGE_DEFAULT_APPS_SETTINGS");
//与ACTION_HOME_SETTINGS相同
//intent.setAction("android.settings.action.MANAGE_OVERLAY_PERMISSION");
//在其他应用上层显示,悬浮窗
//intent.setAction("android.settings.MANAGE_UNKNOWN_APP_SOURCES");
//安装未知应用 安卓8.0
//intent.setAction("android.settings.action.MANAGE_WRITE_SETTINGS");
//可修改系统设置 权限
//intent.setAction("android.settings.MEMORY_CARD_SETTINGS");
//内存与存储
//intent.setAction("android.settings.NETWORK_OPERATOR_SETTINGS");
//可用网络选择
//intent.setAction("android.settings.NFCSHARING_SETTINGS");
//NFC设置
//intent.setAction("android.settings.NFC_SETTINGS");
//网络中的 更多设置
//intent.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
//通知权限设置
//intent.setAction("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS");
//勿扰权限设置
//intent.setAction("android.settings.ACTION_PRINT_SETTINGS");
//打印服务设置
//intent.setAction("android.settings.PRIVACY_SETTINGS");
//备份和重置
//intent.setAction("android.settings.SECURITY_SETTINGS");
//安全设置
//intent.setAction("android.settings.SHOW_REGULATORY_INFO");
//监管信息
//intent.setAction("android.settings.SOUND_SETTINGS");
//声音设置
//intent.setAction("android.settings.SYNC_SETTINGS");
//添加账户设置
//intent.setAction("android.settings.USAGE_ACCESS_SETTINGS");
//有权查看使用情况的应用
//intent.setAction("android.settings.USER_DICTIONARY_SETTINGS");
//个人词典
//intent.setAction("android.settings.VOICE_INPUT_SETTINGS");
//辅助应用和语音输入
//intent.setAction("android.settings.VPN_SETTINGS");
//VPN设置
//intent.setAction("android.settings.VR_LISTENER_SETTINGS");
//VR助手
//intent.setAction("android.settings.WEBVIEW_SETTINGS");
//选择webview
//intent.setAction("android.settings.WIFI_IP_SETTINGS");
//高级WLAN设置
//intent.setAction("android.settings.WIFI_SETTINGS");
//选择WIFI,连接WIFI
app.startActivity(intent);
```
```
//取尾部电话号码并拨打电话
var num = "88888813888888888";
var phone = num.substring(num.length - 11);
log(phone); // 获取到13888888888
var intent = new Intent(Intent.ACTION_CALL, app.parseUri("tel:"+phone));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
```
## 启动Activity界面 |startActivity
| 函数名 | 返回值 | 备注 |
| ------------------- | ----------- | ------------------------------------------ |
| app.startActivity() | | 启动Activity界面 |
| **参数名** | **类型** | |
| Activity活动名称 | 字符串/对象 | 可选的值:console日志界面 settings设置界面 |
app.startActivity(options)
* `options` {Object} 选项
根据选项构造一个Intent,并启动该Activity。
```
app.startActivity({
action: "SEND",
type: "text/plain",
data: "file:///sdcard/1.txt"
});
```
```
// 跳转短信界面
app.startActivity({
packageName: "com.android.mms",
className: "com.android.mms.ui.MmsTabActivity",
});
```
## 发送广播 |sendBroadcast
| 函数名 | 返回值 | 备注 |
| ------------------- | -------- | -------------------------------------- |
| app.sendBroadcast() | | 根据选项构造一个Intent,并发送该广播。 |
| **参数名** | **类型** | |
| 选项 | 对象 | |
app.sendBroadcast(options)
* `options` {Object} 选项
根据选项构造一个Intent,并发送该广播。
## 启动服务 |startService
| 函数名 | 返回值 | 备注 |
| ------------------ | -------- | -------------------------------------- |
| app.startService() | | 根据选项构造一个Intent,并启动该服务。 |
| **参数名** | **类型** | |
| 选项 | 对象 | |
app.startService(options)
* `options` {Object} 选项
根据选项构造一个Intent,并启动该服务。
## 发送特定广播 |sendBroadcast
| 函数名 | 返回值 | 备注 |
| ------------------- | -------- | ------------------------------------------------------------ |
| app.sendBroadcast() | | 发送特定名称的广播 |
| **参数名** | **类型** | |
| 特定的广播名称 | 字符串 | `inspect_layout_hierarchy` 布局层次分析、`inspect_layout_bounds` 布局范围 |
app.sendBroadcast(name)
**[v4.1.0新增]**
* `name` {string} 特定的广播名称,包括:
* `inspect_layout_hierarchy` 布局层次分析
* `inspect_layout_bounds` 布局范围
发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。
```
app.sendBroadcast("inspect_layout_bounds");
```
## Intent转换Shell |intentToShell
| 函数名 | 返回值 | 备注 |
| ------------------- | -------- | ------------------------------------------------------------ |
| app.intentToShell() | | 根据选项构造一个Intent,转换为对应的shell的intent命令的参数。 |
| **参数名** | **类型** | |
| 选项 | 对象 | |
app.intentToShell(options)
**[v4.1.0新增]**
* `options` {Object} 选项
根据选项构造一个Intent,转换为对应的shell的intent命令的参数。
例如:
```
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)。
## app.parseUri(uri)
**[v4.1.0新增]**
* `uri` {string} 一个代表Uri的字符串,例如"file:///sdcard/1.txt", "https://www.autojs.org"
* 返回 {Uri} 一个代表Uri的对象,参见[android.net.Uri](https://developer.android.com/reference/android/net/Uri)。
解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回`null`。
需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件`file://...`,返回的Uri会是诸如`content://...`的形式。
```
// 有时候不知道为什么这个函数并不能跳进去,用安卓API就没有问题,以下为scheme跳转
importClass(android.content.Intent);
importClass(android.net.Uri);
var uri = new Uri.parse("scheme://com.jingmai.video.live.startapp?type=2&id=3930193");
var intent = new Intent(Intent.ACTION_VIEW, uri);
app.startActivity(intent);
```
## 从文件路径解析uri | app.getUriForFile(path)
**[v4.1.0新增]**
* `path` {string} 文件路径,例如"/sdcard/1.txt"
* 返回 {Uri} 一个指向该文件的Uri的对象,参见[android.net.Uri](https://developer.android.com/reference/android/net/Uri)。
从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如`content://...`的形式。
## app.getInstalledApps([options])
** [[Pro 8.0.0新增](https://pro.autojs.org/)] **
* `options` {Object} 选项,包括:
* `get`: 指定返回的应用信息中包含的信息
* `"activities"` 应用的Activity组件信息
* `"configurations"` 应用的硬件配置
* `"gids"` 应用的group id
* `"instrumentation"` 应用的Instrumentation信息
* `"intent_filters"` 应用的意图过滤
* `"meta_data"` 应用的元信息(默认)
* `"permissions"` 应用的权限信息
* `"providers"` 应用的ContentProvider组件信息
* `"receivers"` 应用的BroadcastReceiver组件信息
* `"services"` 应用的Service组件信息
* `"shared_library_files"` 应用的动态链接库文件信息
* `"signatures"` 应用的签名信息(已弃用
* `"signing_certificates"` 应用的签名信息
* `"uri_permission_patterns"`
* `"disabled_components"` 被卸载的但保留了数据的应用
* `"disabled_until_used_components"` 禁用直到被使用的组件
* `"uninstalled_packages"` 被卸载的但保留了数据的应用
* `match`: 指定要匹配的应用列表
* `"uninstalled_packages"` 被卸载的但保留了数据的应用
* `"disabled_components"` 被禁用的组件
* `"disabled_until_used_components"` 禁用直到被使用的组件
* `"system_only"` 只匹配系统应用
* `"factory_only"` 只匹配预装应用
* `"apex"` APEX应用
* 返回 {Array\<ApplicationInfo\>}
返回为当前用户安装的所有应用程序包的列表。如果设置了match选项 `uninstalled_packages`,则包括被删除但保留了数据的应用程序。
获取安装的应用列表。
返回值是ApplicationInfo对象的数组。 如果没有安装任何应用,则返回一个空数组。
选项options的match选项用于指定要返回哪些应用程序,get选项用于指定返回的应用程序携带哪些信息。
```javascript
// 获取系统app
let apps = $app.getInstalledApps({
get: ['meta_data'],
match: ['system_only']
});
console.log(apps);
```
## 示例
// 打开应用
```js
var appName = rawInput("请输入应用名称");
launchApp(appName);
```
// 发送意图-文本消息分享
```js
var content = rawInput('请输入要分享的文本');
app.startActivity({
action: "android.intent.action.SEND",
type: "text/*",
extras: {
"android.intent.extra.TEXT": content
},
packageName: "com.tencent.mobileqq",
className: "com.tencent.mobileqq.activity.JumpActivity"
});
```
// 强制停止应用
```js
"auto";
var appName = rawInput("请输入应用名称");
openAppSetting(getPackageName(appName));
while(!click("强制停止"));
```
// 卸载应用
```js
//输入应用名称
var appName = rawInput('请输入要卸载的应用名称');
//获取应用包名
var packageName = getPackageName(appName);
if(!packageName){
toast("应用不存在!");
}else{
//卸载应用
app.uninstall(packageName);
}
```
// 应用工具
```js
var i = dialogs.select("请选择工具", "获取应用包名", "打开应用详情页", "卸载应用");
if(i == -1){
alert("没有选择任何工具!");
}
switch(i){
case 0:
//获取应用包名
appName = rawInput("请输入应用名称", "QQ");
packageName = getPackageName(appName);
toast(packageName);
setClip(packageName);
toast("已复制到剪贴板");
break;
case 1:
//打开应用详情页
appName = rawInput("请输入应用名称", "微信");
openAppSetting(getPackageName(appName));
break;
case 2:
//卸载应用
appName = rawInput("请输入应用名称");
packageName = getPackageName(appName);
if(packageName == ""){
toast("应用不存在");
}else if(confirm("确定卸载应用" + packageName + "吗?")){
app.uninstall(packageName);
}
break;
}
```