| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- 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);
- });
- }
|