HarmonyOS 鸿蒙NEXT中如何打开第三方应用并传递参数?

HarmonyOS 鸿蒙NEXT中如何打开第三方应用并传递参数? 在鸿蒙单框架中如何应用startAbility方式来打开第三方应用并且传递相关参数,例如,打开中国移动App并查询特定号码的话费,有两个步骤

1.首先用startAbility或者Applinking的方式来打开鸿蒙版的中国移动app,是否涉及到相关的权限

2.打开中国移动app,通过参数的方式来传递电话号码及查询话费的需求

查询了官方文档或者AI大模型产生的代码,但始终无法编译通过

7 回复

API12之后,系统限制直接通过startAbility显式拉起其他应用,需改用openLink接口实现应用间跳转。调用方需确保处于前台应用状态,若应用处于后台或锁屏界面,可能无法成功拉起目标应用。

中国移动App需在module.json5中配置skills标签,包含entities(如entity.system.browsable)和actions(如ohos.want.action.viewData),并设置uri匹配规则。调用方需通过openLink接口传入转换后的链接,系统自动匹配目标应用。

参数传递

链接参数格式:

import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';

let link = 'https://example.com/query?phone=13800138000&type=balance'; // 示例链接

let options: common.OpenLinkOptions = {
  appLinkingOnly: false // 优先AppLinking匹配,失败则降级为DeepLinking
};

try {
  common.openLink(link, options).then(() => {
    promptAction.showToast({ message: '跳转成功' });
  }).catch((err: BusinessError) => {
    promptAction.showToast({ message: `跳转失败:${err.code}` });
  });
} catch (err) {
  console.error(`调用异常:${err}`);
}

目标应用在onCreate或onNewWant生命周期中解析参数:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    if (want.uri) {
      const urlParams = new URLSearchParams(want.uri.split('?'));
      const phone = urlParams.get('phone'); // 获取电话号码
      const queryType = urlParams.get('type'); // 获取查询类型
      // 执行业务逻辑...
    }
  }
}

更多关于HarmonyOS 鸿蒙NEXT中如何打开第三方应用并传递参数?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用AppLinking实现标准跳转

配置目标应用:中国移动App需在其module.json5中声明可接收的uri协议:

"skills": [{

"entities": ["entity.system.browsable"],

"actions": ["ohos.want.action.viewData"],

"uris": [{

"scheme": "cmcc",

"host": "query",

"path": "/fee"

}]

}]

生成跳转链接:

import link from '@kit.abilityKit';

let params = { phone: "13800138000", type: "balance" };

let linkUrl = `cmcc://query/fee?${encodeURIComponent(JSON.stringify(params))}`;

link.openLink({ link: linkUrl });

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

【背景知识】

App Linking:使用App Linking进行跳转时,系统会根据接口传入的uri信息(HTTPS链接)将用户引导至目标应用中的特定内容,无论应用是否已安装,用户都可以访问到链接对应的内容,跳转体验相比Deep Linking方式更加顺畅。

【参考方案】:

可参考基于App Linking实现社交分享跳转示例,通过Share Kit分享文章详情的App Linking链接给好友(畅连好友),好友可以点击链接实现应用跳转,直达文章详情,提升用户体验。当应用未安装应用时,一键直达文章详情页或者应用市场(未安装该社交应用的情况下,方便好友直接安装)。

  • 通过Share Kit的systemShare模块实现分享功能。
  • 应用首次启动时,通过deferredLink.popDeferredLink()获取用户此前点击的该应用相关链接,根据链接中的参数直接跳转到详情页。
  • 在AppGallery Connect中配置直达应用市场,当应用未安装时,点击链接直接跳转到应用市场。
  1. 使用startAbility或者Applinking的方式来打开鸿蒙版的中国移动app,不会涉及到权限问题。

  2. startAbility接口是将应用链接放入want中,通过调用隐式want匹配的方法触发应用跳转。通过startAbility接口启动时,还需要调用方传入待匹配的action和entity。

startAbility中是支持携带参数跳转,parameters参数用法:parameters携带开发者自定义参数,由UIAbilityA传递给UIAbilityB,并在UIAbilityB中进行获取。

// (1) UIAbilityA通过startability启动UIAbilityB
import { UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    let want: Want = {
      bundleName: 'com.example.myapplication',
      abilityName: 'UIAbilityB',
      parameters: {
        developerParameters: 'parameters',
      },
    };

    this.context.startAbility(want, (err: BusinessError) => {
      if (err.code) {
        console.error(`Failed to startAbility. Code: ${err.code}, message: ${err.message}`);
      }
    });
  }
}
// (2) 以UIAbilityB实例首次启动为例,会进入到UIAbilityB的onCreate生命周期
import { UIAbility, Want, AbilityConstant } from '@kit.AbilityKit';

class UIAbilityB extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    console.log(`onCreate, want parameters: ${want.parameters?.developerParameters}`);
  }
}

startAbility携带电话号跳转到中国移动APP后,在中国移动应该接受从对应的参数,然后进行查询话费信息,这些操作需要中国移动app有对应的操作才行,或者可以咨询下中国移动是否有对应的url链接可以支持携带电话号并查询话费。

在HarmonyOS NEXT中,使用want参数通过startAbility方法启动第三方应用并传递数据。示例代码:

import { BusinessError } from '@ohos.base';
let wantInfo = {
  bundleName: "目标应用包名",
  abilityName: "目标Ability名称",
  parameters: {
    key: "需要传递的参数值"
  }
};

try {
  await context.startAbility(wantInfo);
} catch (error) {
  console.error(`启动失败: ${(error as BusinessError).message}`);
}

通过parameters字段以键值对形式传递参数。

在HarmonyOS NEXT中,可以通过startAbility方式启动第三方应用并传递参数。以下是具体实现步骤:

  1. 使用startAbility启动应用

    • 通过want参数指定目标应用的bundleName和abilityName,确保已声明必要的权限(如ohos.permission.START_ABILITIES_FROM_BACKGROUND,若需后台启动)。
    • 示例代码:
      let want = {
        bundleName: "com.chinamobile.hmosapp", // 替换为目标应用的实际bundleName
        abilityName: "MainAbility",
        parameters: {
          phoneNumber: "13800138000",
          action: "queryBalance"
        }
      };
      context.startAbility(want).then(() => {
        console.log("启动成功");
      }).catch((err) => {
        console.error("启动失败: " + JSON.stringify(err));
      });
      
  2. 参数传递与权限

    • 参数通过want.parameters传递,目标应用需在其ability的onCreateonNewWant中接收(例如通过want.parameters.phoneNumber获取)。
    • 若目标应用未暴露ability或参数接口,需依赖其提供的HarmonyOS API或文档支持。目前中国移动App若未公开相关协议,可能无法直接调起具体功能。
  3. 常见问题

    • 编译失败通常是由于bundleName或abilityName错误,或权限未在module.json5中声明。请检查目标应用的准确信息,并确认权限配置:
      "requestPermissions": [
        {
          "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND"
        }
      ]
      
    • 若第三方应用未适配HarmonyOS NEXT的接口,此方式可能受限。建议联系应用开发者确认参数协议。
回到顶部