HarmonyOS 鸿蒙NEXT中如何打开第三方应用并传递参数?
HarmonyOS 鸿蒙NEXT中如何打开第三方应用并传递参数? 在鸿蒙单框架中如何应用startAbility方式来打开第三方应用并且传递相关参数,例如,打开中国移动App并查询特定号码的话费,有两个步骤
1.首先用startAbility或者Applinking的方式来打开鸿蒙版的中国移动app,是否涉及到相关的权限
2.打开中国移动app,通过参数的方式来传递电话号码及查询话费的需求
查询了官方文档或者AI大模型产生的代码,但始终无法编译通过
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中配置直达应用市场,当应用未安装时,点击链接直接跳转到应用市场。
-
使用startAbility或者Applinking的方式来打开鸿蒙版的中国移动app,不会涉及到权限问题。
-
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
方式启动第三方应用并传递参数。以下是具体实现步骤:
-
使用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)); });
- 通过
-
参数传递与权限:
- 参数通过
want.parameters
传递,目标应用需在其ability的onCreate
或onNewWant
中接收(例如通过want.parameters.phoneNumber
获取)。 - 若目标应用未暴露ability或参数接口,需依赖其提供的HarmonyOS API或文档支持。目前中国移动App若未公开相关协议,可能无法直接调起具体功能。
- 参数通过
-
常见问题:
- 编译失败通常是由于bundleName或abilityName错误,或权限未在
module.json5
中声明。请检查目标应用的准确信息,并确认权限配置:"requestPermissions": [ { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" } ]
- 若第三方应用未适配HarmonyOS NEXT的接口,此方式可能受限。建议联系应用开发者确认参数协议。
- 编译失败通常是由于bundleName或abilityName错误,或权限未在