#2023盲盒+码# 检测是否已安装某个应用以及获取启动AbilityName 原创

westinyang
发布于 2023-8-31 15:48
浏览
0收藏

【本文正在参加 2023「盲盒」+码有奖征文活动】 https://ost.51cto.com/posts/25284

@toc

序言

在之前的技术分享中,提到了如何使用包管理下的installer模块的api去安装和卸载应用,在实际应用中呢,只有安装卸载肯定是不够的,如果我们要检测目标包名应用是否存在,就需要用到bundleManager模块了,这个模块提供应用信息查询能力,支持BundleInfo、ApplicationInfo、Ability、ExtensionAbility等信息的查询。除了查询指定应用信息用到的ohos.permission.GET_BUNDLE_INFOnormal级别的权限,查询所有应用信息、清理应用缓存和设置禁用使能所需的权限都是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)}`);
});

相关文档

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐