【HarmonyOS 5】Integrating WeChat Sharing into HarmonyOS Applications

简介: 【HarmonyOS 5】Integrating WeChat Sharing into HarmonyOS Applications


1. Download HarmonyOS WeChat Open SDK and Demo

1.1 WeChat_Open_SDK

Insert image description here
Click to download @tencent/wechat_open_sdk(V1.0.7).

1.2 Official Demo Download

Insert image description here
Click to download OpenSDK-1.0.0.zip.
Insert image description here


2. Run the Demo Project

After syncing the configuration of the WeChat demo project and enabling automatic signing, it runs successfully with the following effect:
Insert image description here

The WeChat sharing page (triggered by the "Send Message" button) supports two sharing types: text and images. Image sharing includes three methods: network image URI, album selection, and local image data:
Insert image description here

The sharing logic is implemented in SendMessage.ets. Without configuring the APPID, clicking "Send XX Message" redirects to WeChat but shows an error:
Insert image description here

Configuration Steps:

  1. Update Constants.ets with your app's information.
  2. Register your HarmonyOS app on the WeChat Open Platform, configuring the package name and other details.
    (Note: WeChat requires a registered app ID; no test ID is provided for preview.)
    Insert image description here


3. Integrate Sharing Functionality

3.1 Install SDK Dependencies

Use the latest SDK version in your project:
Insert image description here

"dependencies": {
  "@tencent/wechat_open_sdk": "1.0.3"
}

Insert image description here

Current Limitations:

  • Only sharing to chat sessions is supported; sharing to Moments is under development.


3.2 Text Sharing (Refer to SendMessage.ets)
import * as wxopensdk from '@tencent/wechat_open_sdk';
onClickSendText = async () => {
  // Create text object
  const textObject = new wxopensdk.WXTextObject();
  textObject.text = kTextMessage;
  
  // Wrap in media message
  const mediaMessage = new wxopensdk.WXMediaMessage();
  mediaMessage.mediaObject = textObject;
  
  // Send request
  const req = new wxopensdk.SendMessageToWXReq();
  req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;
  req.message = mediaMessage;
  const finished = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
  console.log("send request finished: ", finished);
}


3.3 Image Sharing (Refer to SendMessage.ets)
(1) Share Image by Network URL
import * as wxopensdk from '@tencent/wechat_open_sdk';
onClickSendImageByUrl = () => {
  const imageUrl = "https://img.tukuppt.com/photo-big/00/10/77/619619681755c5463.jpg";
  
  // Download image to app sandbox
  this.downloadImageWithUrl(imageUrl, async (imageData) => {
    let file: fileIo.File | undefined;
    const filePath = getContext(this).filesDir + `/original-${Date.now()}.jpg`;
    file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
    fileIo.writeSync(file.fd, imageData);
    fileIo.closeSync(file);
    
    // Create image object with local path
    const imageObject = new wxopensdk.WXImageObject();
    imageObject.uri = fileUri.getUriFromPath(filePath);
    
    // Wrap and send
    const mediaMessage = new wxopensdk.WXMediaMessage();
    mediaMessage.mediaObject = imageObject;
    
    const req = new wxopensdk.SendMessageToWXReq();
    req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;
    req.message = mediaMessage;
    this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
  });
}
downloadImageWithUrl(url: string, completion: (imageData: ArrayBuffer) => void) {
  http.createHttp().request(url, (error: BusinessError, data: http.HttpResponse) => {
    if (error || data.responseCode !== 200) return;
    completion(data.result as ArrayBuffer);
  });
}
(2) Share Image from Album
onClickSendImageByAlbum = async () => {
  const imageObject = new wxopensdk.WXImageObject();
  imageObject.uri = await this.getPictureUriFromAlbum();
  
  const mediaMessage = new wxopensdk.WXMediaMessage();
  mediaMessage.mediaObject = imageObject;
  
  const req = new wxopensdk.SendMessageToWXReq();
  req.scene = this.currentScene;
  req.message = mediaMessage;
  this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
}
async getPictureUriFromAlbum(): Promise<string> {
  const options = new photoAccessHelper.PhotoSelectOptions();
  options.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
  options.maxSelectNumber = 1;
  
  const picker = new photoAccessHelper.PhotoViewPicker();
  const result = await picker.select(options);
  const albumPath = result.photoUris[0];
  
  const context = getContext(this) as common.UIAbilityContext;
  let file: fileIo.File | undefined;
  file = fileIo.openSync(albumPath, fileIo.OpenMode.READ_ONLY);
  
  const timeStamp = Date.now();
  fileIo.copyFileSync(file.fd, context.filesDir + `/original-${timeStamp}.jpg`);
  fileIo.closeSync(file);
  
  const filePath = context.filesDir + `/original-${timeStamp}.jpg`;
  return fileUri.getUriFromPath(filePath);
}
(3) Share Image from App Resources
onClickSendImageByData = async () => {
  // Get image from resources and convert to PixelMap
  const resourceManager = getContext(this).resourceManager;
  const imageArray = await resourceManager.getMediaContent($r('app.media.test0'));
  const pixelBuffer = imageArray.buffer as ArrayBuffer;
  const imageResource = image.createImageSource(pixelBuffer);
  const opts: image.DecodingOptions = { editable: true };
  const pixelMap = await imageResource.createPixelMap(opts);
  
  // Compress and convert to ArrayBuffer
  const packer = image.createImagePacker();
  const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 30 };
  await packer.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {
    // Create image object with base64 data
    const imageObject = new wxopensdk.WXImageObject();
    const buf = buffer.from(data);
    imageObject.imageData = buf.toString('base64', 0, buf.length);
    
    // Wrap and send
    const mediaMessage = new wxopensdk.WXMediaMessage();
    mediaMessage.mediaObject = imageObject;
    
    const req = new wxopensdk.SendMessageToWXReq();
    req.scene = this.currentScene;
    req.message = mediaMessage;
    this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
  });
}

Note:
WeChat has a 100KB limit for image sharing. Using URI-based sharing is recommended to avoid manual compression.


3.4 New Features in Version 1.0.7
(1) Share Webpage
// Create webpage object
const webpageObject = new wxopensdk.WXWebpageObject();
webpageObject.webpageUrl = "http://www.qq.com";
// Wrap in media message
const mediaMessage = new wxopensdk.WXMediaMessage();
mediaMessage.mediaObject = webpageObject;
mediaMessage.title = "Test Webpage Link";
mediaMessage.description = "Test webpage summary";
// Set thumbnail
const thumbData = await getContext(this).resourceManager.getMediaContent($r("app.media.thumb_img"));
const thumbPixel = image.createImageSource(thumbData.buffer).createPixelMapSync();
const thumbBuffer = await image.createImagePacker().packToData(thumbPixel, { format: "image/png", quality: 100 });
mediaMessage.thumbData = new Uint8Array(thumbBuffer);
// Send request
const req = new wxopensdk.SendMessageToWXReq();
req.callbackAbility = kDemoEntryAbility;
req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;
req.message = mediaMessage;
this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
(2) Share Mini Program
// Create mini program object
const miniProgramObject = new wxopensdk.WXMiniProgramObject();
miniProgramObject.userName = "gh_ac032d0848a9"; // Replace with your mini program's username
miniProgramObject.path = "pages/Home/Home";
miniProgramObject.miniprogramType = wxopensdk.WXMiniProgramType.RELEASE;
// Wrap in media message
const mediaMessage = new wxopensdk.WXMediaMessage();
mediaMessage.mediaObject = miniProgramObject;
mediaMessage.title = "Test Mini Program Share Title";
mediaMessage.description = "Mini program share description";
// Set thumbnail
const thumbData = await getContext(this).resourceManager.getMediaContent($r("app.media.thumb_img2"));
const thumbPixel = image.createImageSource(thumbData.buffer).createPixelMapSync();
const thumbBuffer = await image.createImagePacker().packToData(thumbPixel, { format: "image/png", quality: 100 });
mediaMessage.thumbData = new Uint8Array(thumbBuffer);
// Send request
const req = new wxopensdk.SendMessageToWXReq();
req.callbackAbility = kDemoEntryAbility;
req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;
req.message = mediaMessage;
this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);

Note:
Do not use the demo's userName for mini program sharing—use your target mini program's configuration instead.

目录
相关文章
|
敏捷开发 Cloud Native 安全
云原生有哪些优缺点呢
云原生有哪些优缺点呢
|
数据可视化
需求不明确该怎么办?
需求不明确该怎么办?
1174 0
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1960 13
|
人工智能 编解码 自然语言处理
重磅更新!ModelScope FlowBench 支持视频生成 + 图像编辑,AI创作全面升级!
很高兴地向大家宣布,ModelScope FlowBench 客户端迎来重大功能升级! 本次更新不仅正式支持了视频节点功能,还新增了图像编辑与IC-Light智能打光等实用功能,同时对多个图像处理节点进行了深度优化和扩展。现在,您只需在 FlowBench 中轻松串联节点,即可使用 Wan2.1/Wan2.2、Qwen-Image-Edit、FLUX Kontext、IC-Light等强大模型,轻松实现创意内容的生成与编辑。 无论你是内容创作者、视觉设计师,还是AI技术爱好者,这次更新都将为你打开全新的创作边界。
1341 14
|
Linux 应用服务中间件 nginx
Docker 大势已去,Podman 即将崛起……
Docker 大势已去,Podman 即将崛起……
2292 0
Docker 大势已去,Podman 即将崛起……
|
网络协议 网络架构
【IP协议】解决 IP 地址不够用的问题(IP地址管理:动态分配、NAT、Ipv6)
【IP协议】解决 IP 地址不够用的问题(IP地址管理:动态分配、NAT、Ipv6)
973 1
|
存储 缓存 小程序
微信小程序数据缓存与本地存储:优化用户体验
本文深入探讨微信小程序的数据缓存与本地存储,介绍其意义、机制及应用场景。通过合理使用内存和本地缓存,可减少网络请求、提升加载速度和用户体验。文中详细讲解了常用缓存API的使用方法,并通过一个新闻列表案例展示了缓存的实际应用。最后提醒开发者注意缓存大小限制、时效性和清理,以确保最佳性能。
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
963 0
|
XML API 数据格式
微信PC版的API接口
微信PC版的API接口
1610 0
|
Java Spring
Springboot整合Netty,自定义协议实现
以上就是在Spring Boot中整合Netty并实现自定义协议的基本步骤。你需要根据你的自定义协议的具体需求,来实现你的编码器、解码器和处理器。
1393 0

热门文章

最新文章