一、背景
在App开发中,分享是常用功能,这里介绍鸿蒙开发中,其他应用分享到自己的app中,或者自己的app分享给其他app
鸿蒙系统分享地址
二、app发起分享
1. 通过分享面板进行分享
- 导入相关模块。
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
- 获取统一数据类型
可以自己确定分享的类型,也可以调用方法通过后缀获取分享类型
getUniformDataTypeByFilenameExtension
let utdTypeId = ""
if (file.extension.length == 0) {
utdTypeId = utd.UniformDataType.FOLDER
} else {
utdTypeId = utd.getUniformDataTypeByFilenameExtension(file.extension, utd.UniformDataType.OBJECT);
}
if (utdTypeId.length == 0) {
promptAction.showToast({message: appUtils.getResString('share_tip2')})
return
}
- 构造分享数据,可添加多条分享记录。
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: utdTypeId,
uri: file.uri
});
- 启动分享面板时,配置分享面板显示的位置信息或关联的组件ID,面板将以Popup形式展示。
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 获取UIAbility上下文对象
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
// 进行分享面板显示
controller.show(context, {
previewMode: systemShare.SharePreviewMode.DEFAULT,
selectionMode: systemShare.SelectionMode.SINGLE
});
2. 使用其他应用打开
通过context调用startAbility,弹出系统弹窗,使用其他应用打开文件
// Construct request data Want, taking opening a Word file as an example
let wantInfo: Want = {
uri: file.uri, // Indicate the URI path of the file to be opened, usually used in conjunction with type
type: 'application/msword', // Indicate the type of file to be opened
flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION, // Authorization to perform write operations on URI
}
// Call the startAbility interface to open files
let context = getContext(this) as common.UIAbilityContext;
context.startAbility(wantInfo).then(() => {
console.info("分享成功");
}).catch((err: BusinessError) => {
console.info("分享失败");
})
二、处理分享的内容
1. module.json5
配置可接收分享
在module.json5
下找到 abilities
标签,找到 skills
- 配置entities添加
"entity.system.share"
"entities": [
"entity.system.home",
"entity.system.share"
],
- 配置actions,添加actions
"actions": [
"action.system.home",
"ohos.want.action.select",
"ohos.want.action.sendData",
"ohos.want.action.viewData" // 必填,声明数据处理能力
],
- 配置uris
"uris": [
{
"scheme": "file",// 物理存储类型的基类型
"utd": "general.entity",
"maxFileSupported": 1,
"linkFeature": "FileOpen"
},
{
"scheme": "file",// 逻辑内容类型的基类型
"utd": "general.object",
"maxFileSupported": 1,
"linkFeature": "FileOpen"
}
]
2. 解析分享的数据
- 在其onCreate或onNewWant回调中获取传入的want参数
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
// 注入Ability上下文到AppUtils
AppUtils.getInstance().context = this.context;
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
ShareManager.getInstance().handelShareData(want);
}
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
ShareManager.getInstance().handelShareData(want)
}
- 通过
getSharedData
解析分享数据
/** 处理分享过来的文件 */
public handelShareData(want: Want) {
systemShare.getSharedData(want)
.then((data: systemShare.SharedData) => {
data.getRecords().forEach((record: systemShare.SharedRecord) => {
// 处理分享数据
});
})
.catch((error: BusinessError) => {
DKLogger.error(`Failed to getSharedData. Code: ${error.code}, message: ${error.message}`);
// this.context.terminateSelf();
if (want.action == 'ohos.want.action.sendData'
|| want.action == 'ohos.want.action.viewData') {
}
});
}
处理完分享数据,即可将数据在页面显示