#2023盲盒+码# 检测是否已安装某个应用以及获取启动AbilityName 原创
【本文正在参加 2023「盲盒」+码有奖征文活动】 https://ost.51cto.com/posts/25284
@toc
序言
在之前的技术分享中,提到了如何使用包管理下的installer模块
的api去安装和卸载应用,在实际应用中呢,只有安装卸载肯定是不够的,如果我们要检测目标包名应用是否存在,就需要用到bundleManager模块
了,这个模块提供应用信息查询能力,支持BundleInfo、ApplicationInfo、Ability、ExtensionAbility等信息的查询。除了查询指定应用信息用到的ohos.permission.GET_BUNDLE_INFO
是normal
级别的权限,查询所有应用信息、清理应用缓存和设置禁用使能所需的权限都是system_basic
级别的。
具体实现
项目权限配置:entry/src/main/module.json5
{
"name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED",
},
访问控制权限配置:openharmony-sdk\9\toolchains\lib\UnsgnedReleasedProfileTemplate.json
"apl":"system_basic",
"app-feature":"hos_system_app"
通过 bundleManager.getBundleInfo
去查找指定包名应用的信息,如果找不到就说明未安装此应用,如果能获取到,可以顺便获取下 启动AbilityName
以及 版本号
等信息。
这个接口需要 ohos.permission.GET_BUNDLE_INFO_PRIVILEGED
(允许应用查询其他应用的信息)system_basic
级别的权限。
其中的 bundleFlags
参数,实际上是指定获取哪些包信息内容,比如 GET_BUNDLE_INFO_WITH_HAP_MODULE
就是用于获取包含hapModuleInfo的bundleInfo,获取的bundleInfo不包含signatureInfo、applicationInfo、ability、extensionAbility和permission的信息,而 GET_BUNDLE_INFO_WITH_ABILITY
是用于获取包含ability的bundleInfo相关信息的。
import bundleManager from '@ohos.bundle.bundleManager';
import hilog from '@ohos.hilog';
......
// 记录启动AbilityName
@State mainAbilityName: string = ''
@State versionCode: string = ''
......
// 检查应用是否已经安装,并获取指定包名应用的启动Ability名
let bundleName = 'com.example.testapp';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_HAP_MODULE | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_ABILITY;
let userId = 100;
try {
bundleManager.getBundleInfo(bundleName, bundleFlags, userId, (err, data) => {
if (err) {
// 获取失败
hilog.error(0x0000, 'testTag', '获取失败: %{public}s', err.message);
} else {
// 获取成功
hilog.info(0x0000, 'testTag', '获取成功: %{public}s', JSON.stringify(data));
// 记录 启动AbilityName 和 版本号 等信息
this.mainAbilityName = data.hapModulesInfo[0].mainElementName;
this.versionCode = data.versionName;
}
});
} catch (err) {
hilog.error(0x0000, 'testTag', 'getBundleInfo failed: %{public}s', err.message);
}
检测到应用已安装的话,我们就可以通过 context.startAbility 直接打开目标应用了
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';
......
// 打开应用
let context = getContext(this) as common.UIAbilityContext;
context.startAbility({
bundleName: '应用包名',
abilityName: '启动AbilityName',
moduleName: '',
}).then(() => {
promptAction.showToast({ message: '打开成功', duration: ToastDuration });
}, (err) => {
console.error(`打开失败: ${JSON.stringify(err)}`);
});