Files
jindengchen-ai-report/cool-unix/uni_modules/cool-share/utssdk/app-harmony/share.ets
2025-11-13 10:36:23 +08:00

265 lines
7.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { UTSHarmony } from '@dcloudio/uni-app-x-runtime';
import { systemShare } from '@kit.ShareKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
import { fileUri } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
/**
* 分享类型枚举
*/
enum ShareType {
TEXT = "text", // 纯文本分享
IMAGE = "image", // 图片分享
VIDEO = "video", // 视频分享
AUDIO = "audio", // 音频分享
FILE = "file", // 文件分享
LINK = "link" // 链接分享
}
/**
* 根据文件路径获取统一数据类型标识符
* @param filePath 文件路径
* @param defaultType 默认数据类型
* @returns 统一数据类型标识符
*/
function getUtdTypeByPath(filePath: string, defaultType: string): string {
const ext = filePath?.split('.')?.pop()?.toLowerCase() ?? '';
if (ext === '') {
return defaultType;
}
return utd.getUniformDataTypeByFilenameExtension('.' + ext, defaultType);
}
/**
* 创建图片分享数据
* @param url 图片路径(支持本地路径和网络 URL
* @param title 分享标题
* @param summary 分享描述
* @returns 分享数据对象
*/
function createImageShareData(url: string, title: string, summary: string): systemShare.SharedData | null {
if (url === '') {
return null;
}
const filePath = UTSHarmony.getResourcePath(url);
const utdTypeId = getUtdTypeByPath(filePath, utd.UniformDataType.IMAGE);
return new systemShare.SharedData({
utd: utdTypeId,
uri: fileUri.getUriFromPath(filePath),
title: title,
description: summary,
});
}
/**
* 创建视频分享数据
* @param url 视频路径(支持本地路径和网络 URL
* @param title 分享标题
* @param summary 分享描述
* @returns 分享数据对象
*/
function createVideoShareData(url: string, title: string, summary: string): systemShare.SharedData | null {
if (url === '') {
return null;
}
const filePath = UTSHarmony.getResourcePath(url);
const utdTypeId = getUtdTypeByPath(filePath, utd.UniformDataType.VIDEO);
return new systemShare.SharedData({
utd: utdTypeId,
uri: fileUri.getUriFromPath(filePath),
title: title,
description: summary,
});
}
/**
* 创建音频分享数据
* @param url 音频路径(支持本地路径和网络 URL
* @param title 分享标题
* @param summary 分享描述
* @returns 分享数据对象
*/
function createAudioShareData(url: string, title: string, summary: string): systemShare.SharedData | null {
if (url === '') {
return null;
}
const filePath = UTSHarmony.getResourcePath(url);
const utdTypeId = getUtdTypeByPath(filePath, utd.UniformDataType.AUDIO);
return new systemShare.SharedData({
utd: utdTypeId,
uri: fileUri.getUriFromPath(filePath),
title: title,
description: summary,
});
}
/**
* 创建文件分享数据
* @param filePath 文件路径(支持本地路径和网络 URL
* @param title 分享标题
* @param summary 分享描述
* @returns 分享数据对象
*/
function createFileShareData(filePath: string, title: string, summary: string): systemShare.SharedData | null {
if (filePath === '') {
return null;
}
const resourcePath = UTSHarmony.getResourcePath(filePath);
const ext = resourcePath?.split('.')?.pop()?.toLowerCase() ?? '';
// 根据文件扩展名确定数据类型
let utdType = utd.UniformDataType.FILE;
let utdTypeId = '';
// 支持常见的文件类型
switch (ext) {
case 'zip':
case 'rar':
case '7z':
case 'tar':
case 'gz':
utdType = utd.UniformDataType.ARCHIVE;
break;
case 'pdf':
utdType = utd.UniformDataType.PDF;
break;
case 'doc':
case 'docx':
utdType = utd.UniformDataType.WORD_DOC;
break;
case 'xls':
case 'xlsx':
utdType = utd.UniformDataType.EXCEL;
break;
case 'ppt':
case 'pptx':
utdType = utd.UniformDataType.PPT;
break;
default:
utdType = utd.UniformDataType.FILE;
break;
}
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.' + ext, utdType);
return new systemShare.SharedData({
utd: utdTypeId,
uri: fileUri.getUriFromPath(resourcePath),
title: title,
description: summary,
});
}
/**
* 创建链接分享数据
* @param url 链接地址
* @param title 分享标题
* @param summary 分享描述
* @returns 分享数据对象
*/
function createLinkShareData(url: string, title: string, summary: string): systemShare.SharedData {
return new systemShare.SharedData({
utd: utd.UniformDataType.HYPERLINK,
title: title,
content: url,
description: summary
});
}
/**
* 创建文本分享数据
* @param title 分享标题
* @param summary 分享内容
* @returns 分享数据对象
*/
function createTextShareData(title: string, summary: string): systemShare.SharedData {
return new systemShare.SharedData({
utd: utd.UniformDataType.TEXT,
title: title,
content: summary
});
}
/**
* 系统分享功能
* @param options 分享参数
* @param options.type 分享类型: text(文本) | image(图片) | video(视频) | audio(音频) | file(文件) | link(链接)
* @param options.title 分享标题
* @param options.summary 分享描述/内容
* @param options.url 资源路径(图片/视频/音频/文件路径或链接地址,支持本地路径和网络 URL
* @param options.success 成功回调
* @param options.fail 失败回调
*/
export function share(type: string, title: string, summary: string, url: string, success: () => void, fail: (error: string) => void): void {
// 获取UI上下文
const uiContext: UIContext = UTSHarmony.getCurrentWindow()?.getUIContext();
const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
// 根据分享类型创建分享数据
let shareData: systemShare.SharedData | null = null;
let errorMsg = '';
switch (type) {
case ShareType.IMAGE:
shareData = createImageShareData(url, title, summary);
errorMsg = '图片路径不能为空';
break;
case ShareType.VIDEO:
shareData = createVideoShareData(url, title, summary);
errorMsg = '视频路径不能为空';
break;
case ShareType.AUDIO:
shareData = createAudioShareData(url, title, summary);
errorMsg = '音频路径不能为空';
break;
case ShareType.FILE:
shareData = createFileShareData(url, title, summary);
errorMsg = '文件路径不能为空';
break;
case ShareType.LINK:
shareData = createLinkShareData(url, title, summary);
break;
default:
// 默认为文本分享
shareData = createTextShareData(title, summary);
errorMsg = '分享内容不能为空';
break;
}
// 验证分享数据
if (shareData === null) {
fail(errorMsg);
return;
}
// 创建分享控制器
const controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 显示分享面板,配置分享选项
controller.show(context, {
selectionMode: systemShare.SelectionMode.SINGLE, // 单选模式
previewMode: systemShare.SharePreviewMode.DEFAULT, // 默认预览模式
})
.then(() => {
// 分享成功
success();
})
.catch((error: BusinessError) => {
// 分享失败,返回错误信息
const errorMessage = error?.message ?? '分享失败';
fail(errorMessage);
});
}