
回复
可可图标编辑也实现了图片的分享功能,演示效果如下。
hare Kit(分享服务)为应用提供文本、图片、视频等内容跨应用、跨端分享能力。
应用把需要分享的内容和预览样式配置给Share Kit,Share Kit将根据不同的场景进行使用:
应用类型 | 相关逻辑 |
---|---|
宿主应用 | 宿主应用需要对可分享的内容提供分享入口,在用户点击分享时,配置分享内容到分享,拉起系统分享面板。通过分享面板发起分享碰一碰分享 |
目标应用 | 需要在应用中构建具有数据处理能力组件,包括以下两种分享方式。应用内处理分享内容分享详情页处理分享内容(可选)社交类应用可遵照意图框架接入规范把最近分享行为联系人相关信息捐献到意图框架,Share Kit可从意图框架获取推荐信息,当用户选择推荐的联系人时,会把联系人信息随分享数据一起给到目标应用,目标应用可以根据联系人信息直接一步发送内容给指定用户。 |
Share Kit 可以分为 systemShare 和 HarmonyShare ,两者区别主要是:
在实际开发中,两者可能配合使用:
跨端分享:通过 HarmonyShare 发起碰一碰传输,接收端通过 HarmonyShare 的沙箱监听处理数据。
应用内分享:通过 systemShare 构造分享内容,用户选择目标应用后跳转到对应页面。
PhotoSelectOptions
对象,设置 MIMEType
为 IMAGE_TYPE
限制只能选择图片类型文件maxSelectNumber = 5
限制最大可选择数量,符合鸿蒙系统图片选择器的多选能力PhotoViewPicker
类(鸿蒙媒体访问框架)创建选择器实例,体现鸿蒙API的分层设计select()
方法触发系统图片选择界面,采用Promise异步处理机制:
photoUris
数组,取首元素赋值给组件状态变量 fileUri
,并打印完整URI列表BusinessError
异常,输出包含错误码和消息的日志,符合ArkTS错误处理规范 Button("选择图片")
.onClick(() => {
// 1 设置选择图片的参数
const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目。
let uris: Array<string> = [];
// 2 创建图片选择器
const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
// 3 开始选择图片
photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
uris = photoSelectResult.photoUris;
this.fileUri = uris[0]
console.info('photoViewPicker.select to file succeed and uris are:' + uris);
}).catch((err: BusinessError) => {
console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})
})
getUIContext().getHostContext()
获取 UIAbility 上下文cacheDir
属性获取应用专属缓存目录(框架提供的安全存储路径)split('.').pop()
解析原始文件的扩展名(ArkTS 的字符串操作特性)Date.now()
生成时间戳作为文件名前缀,确保文件名唯一性fs.openSync
以只读模式打开源文件(ArkTS 文件系统 API)fs.copyFileSync
执行文件描述符到目标路径的同步拷贝操作AlertDialog
显示操作结果(ArkUI 的声明式 UI 组件)copyFilePath
赋值给 this.cacheUri
,用于后续数据绑定或状态管理(响应式编程特性)Button("复制到沙箱")
.onClick(async () => {
try {
const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
const cacheDir = context.cacheDir;
const fileType = this.fileUri.split('.').pop() // 后缀名
// 生成一个新的文件名
const fileName = Date.now() + '.' + fileType
// 通过缓存路径+文件名 拼接出完整的路径
const copyFilePath = cacheDir + '/' + fileName
// 将文件 拷贝到 临时目录
const file = fs.openSync(this.fileUri, fs.OpenMode.READ_ONLY)
fs.copyFileSync(file.fd, copyFilePath)
AlertDialog.show({ message: JSON.stringify('写入到沙箱', null, 2) })
this.cacheUri = copyFilePath
} catch (e) {
AlertDialog.show({ message: JSON.stringify('写入失败', null, 2) })
}
})
获取UI上下文
this.getUIContext()
获取当前UI组件的上下文对象getHostContext()
获取UIAbility上下文,用于后续调用系统分享能力确定统一数据类型(UTD)
utd.getUniformDataTypeByFilenameExtension
API获取标准数据类型标识构建分享数据对象
创建 systemShare.SharedData
实例,包含:
fileUri.getUriFromPath
转换沙箱路径为可访问URI初始化分享控制器
创建systemShare.ShareController
实例,绑定分享数据
显示系统分享界面
调用 controller.show()
步方法,传入:
Button("分享")
.onClick(async () => {
try { // 获取UI上下文
const uiContext: UIContext = this.getUIContext();
const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
// 根据图片格式确定UTD类型
let utdTypeId: string;
switch (this.fileUri.split('.').pop()) {
case 'jpeg':
case 'jpg':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
break;
case 'png':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.png', utd.UniformDataType.IMAGE);
break;
case 'webp':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.webp', utd.UniformDataType.IMAGE);
break;
default:
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
}
// 创建分享数据,使用沙箱中的图片URI
const shareData: systemShare.SharedData = new systemShare.SharedData({
utd: utdTypeId,
title: 'Picture Title',
description: 'Picture Description',
uri: fileUri.getUriFromPath(this.cacheUri),
});
// 创建分享控制器
const controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 显示分享界面
await controller.show(context, {
selectionMode: systemShare.SelectionMode.SINGLE,
previewMode: systemShare.SharePreviewMode.DETAIL
});
console.log('图片分享成功');
} catch (e) {
console.log('图片分享失败');
}
})
本文介绍了在鸿蒙应用中实现图片分享功能的完整流程。通过 Share Kit 的 systemShare 服务,开发者可以轻松实现应用间的图片分享。核心实现包括三个步骤:
PhotoViewPicker
调用系统图片选择器,支持多选并限制文件类型ShareController
构建分享数据,调用系统分享面板完成跨应用分享整个流程充分利用了鸿蒙系统的媒体访问框架、文件系统 API 和分享服务,为用户提供了原生、流畅的图片分享体验。
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileUri, fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { systemShare } from '@kit.ShareKit';
@ComponentV2
@Entry
struct Index {
fileUri: string = ""
cacheUri: string = ""
build() {
Column({ space: 10 }) {
Button("选择图片")
.onClick(() => {
// 1 设置选择图片的参数
const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目。
let uris: Array<string> = [];
// 2 创建图片选择器
const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
// 3 开始选择图片
photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
uris = photoSelectResult.photoUris;
this.fileUri = uris[0]
console.info('photoViewPicker.select to file succeed and uris are:' + uris);
}).catch((err: BusinessError) => {
console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})
})
Button("复制到沙箱")
.onClick(async () => {
try {
const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
const cacheDir = context.cacheDir;
const fileType = this.fileUri.split('.').pop() // 后缀名
// 生成一个新的文件名
const fileName = Date.now() + '.' + fileType
// 通过缓存路径+文件名 拼接出完整的路径
const copyFilePath = cacheDir + '/' + fileName
// 将文件 拷贝到 临时目录
const file = fs.openSync(this.fileUri, fs.OpenMode.READ_ONLY)
fs.copyFileSync(file.fd, copyFilePath)
AlertDialog.show({ message: JSON.stringify('写入到沙箱', null, 2) })
this.cacheUri = copyFilePath
} catch (e) {
AlertDialog.show({ message: JSON.stringify('写入失败', null, 2) })
}
})
Button("分享")
.onClick(async () => {
try { // 获取UI上下文
const uiContext: UIContext = this.getUIContext();
const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
// 根据图片格式确定UTD类型
let utdTypeId: string;
switch (this.fileUri.split('.').pop()) {
case 'jpeg':
case 'jpg':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
break;
case 'png':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.png', utd.UniformDataType.IMAGE);
break;
case 'webp':
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.webp', utd.UniformDataType.IMAGE);
break;
default:
utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
}
// 创建分享数据,使用沙箱中的图片URI
const shareData: systemShare.SharedData = new systemShare.SharedData({
utd: utdTypeId,
title: 'Picture Title',
description: 'Picture Description',
uri: fileUri.getUriFromPath(this.cacheUri),
});
// 创建分享控制器
const controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 显示分享界面
await controller.show(context, {
selectionMode: systemShare.SelectionMode.SINGLE,
previewMode: systemShare.SharePreviewMode.DETAIL
});
console.log('图片分享成功');
} catch (e) {
console.log('图片分享失败');
}
})
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
}
最近想要想要考取 HarmonyOS 基础或者高级证书,或者快要获取的同学都可以点击这个链接,加入我的班级,考取成功有机会获得鸿蒙礼盒一份。
带你了解更多HarmonyOS相关的资讯。