HarmonyOS鸿蒙Next中应用能否获取其他应用的包名列表以检测竞品安装?

HarmonyOS鸿蒙Next中应用能否获取其他应用的包名列表以检测竞品安装? 市场分析 App 需统计用户是否安装某竞品。应用能否获取其他应用的包名列表以检测竞品安装?

8 回复

背景知识:

可以使用 bundleManager.canOpenLink() 开查询是否可以打开,可以打开则按照了此app。

不过此查询方法需要知道 entry模块的module.json5文件中,module -> abilities -> skills -> uris。

如:判断的包信息

"uris": [
  {
    "scheme":"schB",
    "host":"com.example.test",
    "path":"open",
  }
],

我们自己的app需要声明:

"querySchemes": [
  "schB"
],

参考:如何判断应用程序是否安装

问题解决:

示例代码:

async function checkAppInstalled(): boolean {
    try {
        const result = bundleManager.canOpenLink(`schB://com.example.test/open`);
        return result;
    } catch (error) {
        console.error(`检测失败: ${error}`);
        return false;
    }
}

更多关于HarmonyOS鸿蒙Next中应用能否获取其他应用的包名列表以检测竞品安装?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


1、检测竞品安装可以看下如何判断应用程序是否安装

2、获取其他应用的包名列表可以通过hdc命令获取或者借助已有的工具查看设备上已安装的应用包名。

  • 方案一: 通过hdc命令获取: 使用hdc shell bm dump -a获取设备上已安装的所有应用包名或者使用hdc shell aa dump -l获取运行中的应用的包名。
  • 方案二:
    • 通过DevEco Testing查看已安装的应用包名。连接设备,创建测试任务(如:稳定性基础质量测试)创建任务面板中的“已安装的应用”中可以查看到所有已安装的应用和元服务的包名。
    • 通过IDE的可视化工具Device File Browser查看设备上已安装的应用包名,打开Device File Browser面板,在/data/app/el2/100/base/路径下即可查看到所有已安装的应用包名。

可以使用 bundleManager.canOpenLink 接口用于检测当前设备是否安装了可以处理特定 URL Scheme 的应用。

开发步骤

步骤一:配置 module.json5

在调用方应用(您的应用)的 entry/src/main/module.json5 文件中,找到 module 节点,添加 querySchemes 字段。

注意querySchemes 数组最多支持配置 50 个 Scheme。

{
  "module": {
    // ... 其他配置
    "querySchemes": [
      "alipay",          // 示例:查询支付宝
      "weixin",          // 示例:查询微信
      "app1Scheme",      // 示例:自定义 Scheme
      "https"            // 示例:查询是否支持 https 链接(通常是浏览器)
    ]
  }
}

步骤二:调用接口

使用 bundleManager 模块调用接口。建议使用 try-catch 捕获可能出现的异常。

import { bundleManager } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG = 'LinkChecker';

function checkLinkAccessibility(link: string): boolean {
  try {
    // link 必须包含 scheme,例如 'app1Scheme://test'
    let canOpen = bundleManager.canOpenLink(link);
    hilog.info(0x0000, TAG, `Link: ${link}, Can Open: ${canOpen}`);
    return canOpen;
  } catch (err) {
    let message = (err as BusinessError).message;
    hilog.error(0x0000, TAG, `canOpenLink failed: ${message}`);
    return false;
  }
}

// 使用示例
const targetUrl = 'app1Scheme://page/detail?id=123';
if (checkLinkAccessibility(targetUrl)) {
  // 链接可打开,执行跳转逻辑 (如 context.startAbility)
  console.info('Target app is installed.');
} else {
  // 链接不可打开,执行降级逻辑 (如跳转 H5 或提示下载)
  console.info('Target app is NOT installed.');
}

参考文章

需要知道竞品App的scheme,通过scheme来判断App是否安装;
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/canopenlink-V13

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

参考官网:

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-package-structure-62

import { hilog } from '@kit.PerformanceAnalysisKit';
import { bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  // Application A determines whether Application B is installed on the device
  isAppBExist() {
    let exist = false;
    try {
      let link = 'schB://com.example.test/open';
      let data: boolean = bundleManager.canOpenLink(link);
      hilog.info(0x0000, 'testTag', 'canOpenLink successfully: %{public}s', JSON.stringify(data));
      exist = data;
    } catch (err) {
      let message = (err as BusinessError).message;
      hilog.error(0x0000, 'testTag', 'canOpenLink failed: %{public}s', message);
      exist = false;
    }
    console.info('Has application B been installed:' + exist);
  }

  @State text: string = 'isAppBExist'

  build() {
    Row() {
      Column() {
        Text(this.text)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.isAppBExist();
          });
      }
      .width('100%')
    }
    .height('100%')
  }
}

根据HarmonyOS鸿蒙Next的设计原则,应用无法直接获取设备上其他应用的包名列表。系统通过严格的沙箱机制和权限管理来隔离应用数据,以保护用户隐私和应用安全。应用只能访问自身被明确授权的信息,无法枚举或检测其他已安装应用,包括竞品应用。

在HarmonyOS Next中,应用不能直接获取设备上其他应用的包名列表来检测竞品安装。这是出于对用户隐私和系统安全性的严格保护。

主要原因如下:

  1. 隐私保护原则:HarmonyOS Next 强化了应用沙箱和权限隔离,应用默认只能访问自身的沙箱数据。查询其他应用列表属于用户敏感信息,直接访问违反了最小化数据收集原则。
  2. 权限管控严格:系统未提供允许应用直接读取全局已安装应用列表的公开API或权限。任何应用都无法通过常规申请权限的方式获得此能力。
  3. 安全机制限制:系统会阻止应用通过非正式接口(如尝试访问系统私有数据文件)来获取此类信息,此类行为会被安全机制拦截或视为违规。

替代方案建议: 若需实现市场分析功能,应通过合规方式获取用户授权后收集信息,例如:

  • 引导用户自主提交其使用的应用信息。
  • 通过问卷调查等间接方式进行分析。

结论: 直接检测竞品安装的行为在HarmonyOS Next中不可行。开发者应遵循隐私规范,采用透明、用户授权的方式实现统计分析功能。

回到顶部