鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息

融云鸿蒙版是不带UI的,得自己一步步搭建。
这次讲如何发送图片消息,选择图片,显示图片消息。
还是有点难度的,好好看,好好学。

一、思路:

选择图片用:photoViewPicker.select

二、效果图:

在这里插入图片描述
在这里插入图片描述

三、关键代码:
/**
   * 选择图片
   * 注:官方说不用申请权限
   */
  public static  openGallery(maxSelectNumber:number,callBack:(result:string[])=>void) {
    if(maxSelectNumber){
      const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
      photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
      photoSelectOptions.maxSelectNumber = maxSelectNumber; // 选择媒体文件的最大数目

      const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
      photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        if (photoSelectResult.photoUris.length > 0) {
          callBack(photoSelectResult.photoUris)
        }
      }).catch((err: BusinessError) => {
        console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
      })
    }else {
      showToast('已选素材数量达到上限')
    }
  }
public static sendImageMessage(targetId: string, localPath: string,successCallBack?:()=>void) {
    let conId = new ConversationIdentifier();
    conId.conversationType = ConversationType.Private;
    conId.targetId = targetId;

    let imageMsg = new ImageMessage();
    imageMsg.localPath = localPath;

    let msgSrc = new Message(conId, imageMsg);
    let option: ISendMsgOption = {};
    let msgAfter: Message = msgSrc
    IMEngine.getInstance().sendMediaMessage(msgSrc, option, (msg: Message) => {
      // 消息保存到数据库
      msgAfter = msg
      msgAfter.sentStatus = SentStatus.Sending
      // 这边会填消息
      EventKeys.postEvent(EventKeys.ReceivedImMessageEvents,ReceivedImMessageEvent(msgAfter))
    }, (msg: Message, progress: number) => {
      // 媒体上传进度 [1 ~ 100]
    }).then(result => {
      if (EngineError.Success !== result.code) {
        //发送消息失败
        msgAfter.sentStatus = SentStatus.Failed
        EventKeys.postEvent(EventKeys.ReceivedImMessageEvents,ReceivedImMessageEvent(msgAfter))
        return;
      }
      if (!result.data) {
        // 消息为空
        // 成功的状态,但是理论上不会出现发送消息成功,但是消息体为空的情况,暂时不处理,避免发送多次通知
        // msgAfter.sentStatus = SentStatus.Sent
        // emitter.emit(EventKeys.RECEIVED_IM_MESSAGE_EVENT, ReceivedImMessageEvent(msgAfter))
        return;
      }
      let msg = result.data as Message;
      EventKeys.postEvent(EventKeys.ReceivedImMessageEvents,ReceivedImMessageEvent(msg))
      // 刷新会话列表,不打算自己插入会话
      EventKeys.postEvent(EventKeys.RefreshMsgListEvents)
      successCallBack?.()
    })

  }
四、整个鸿蒙融云Demo源码结构图:

在这里插入图片描述有问题或者需要完整源码的私信我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业,每天需要处理大量纸质文件,从合同到判决书,手动录入不仅费时,还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台,通过先进的光学字符识别(OCR)技术,将…

详解ReentrantLock--三种加锁方式

目录 介绍AQS: 直观方式解释加锁的流程: Node是什么:它里面有什么属性呢 图解队列的排队过程: 源码分析三种加锁流程: 我们先讲解一下非公平锁的加锁流程: Lock()方式加锁: 在源码里对于Lock()的解…

【教程】Git 标准工作流

目录 前言建仓,拉仓,关联仓库修改代码更新本地仓库,并解决冲突提交代码,合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具,配合代码托管仓库…

Postman断言与依赖接口测试详解!

在接口测试中,断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性,还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具,不仅支持发送HTTP请求和接收响应,还提供了丰富的断言功能,帮助测试…

百度SEO与SEM到底有什么区别?福建企业老板们需要了解的关键点【百度SEO专家】

大家好,我是林汉文,一名百度SEO专家。最近在与一些企业Boss沟通时,我发现很多人对SEO与SEM的区别并不清楚,有时甚至会混为一谈。SEO和SEM确实都是搜索引擎营销的重要手段,但它们在实现方式、效果和适用场景上都有着明显…

JavaFX WebView + Vue初始化加载数据解决方案

一般WebView加载Vue时,我们需要注入一些数据,而我发现当WebView加载完毕再注入脚本,Vue是无法正确识别注入的脚本函数,也无法正确获取所要注入的数据,因此可以采用以下方法解决Vue无法正确加载数据问题 1、配置WebView…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04, 本文安装的版本: cuda_11.1.0;cuDNN-8.2.1;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

传输层协议TCP详解(上篇)

目录 一. TCP协议 1.1 什么是TCP协议 1.2 TCP为什么叫传输控制协议 二. TCP协议段格式 三. 确认应答(ACK)机制 3.1 什么是确认应答机制 3.2 推导确认应答机制 四. 超时重传机制 五. 连接管理机制 5.1 六位标志位 5.2 如何…

wps宏代码学习

推荐学习视频:https://space.bilibili.com/363834767/channel/collectiondetail?sid1139008&spm_id_from333.788.0.0 打开宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮,会让细节别的更明显。膨胀也是形态学中的一种操作,在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作,可以构成开闭操作。 开操作是先腐蚀…

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法

一、项目背景 客户新系统上线,因为行业网络安全要求,需要做等保测评, 通过第三方漏扫工具扫描系统,漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞,具体结果如下: 1、ZooKeeper 未授权访问【…

C语言进阶之我与指针的爱恨情仇(1)

一.前言 我们在初阶《指针》初阶C语言-指针-CSDN博客已经讲过了一些基础知识,知道了关于指针的一些概念-> 1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间 2.指针的大小是固定的4/8个字节(32位平台/64位平台&#xf…

对象池的作用以及简单示例

在游戏当中,有很多时候需要重复地创建或删除某些游戏对象,此时会耗费系统资源,从而影响性能,利用对象池可以解决这个问题。对象池能够节省内存,优化程序流畅程度。 把对象放在一个集合里,通过集合来管理对象…

java并发编程-volatile的作用

文章目录 volatile的作用1.改变线程间的变量可见性2.禁止指令重排序 参考的学习视频 volatile的作用 1.改变线程间的变量可见性 每个线程都有一个专用的工作集内存,下图里面粉色的表示专用工作集内存,黄色的是共享内存工作区,如果加入了vol…

Netty 组件介绍 - EventLoop

概要 把 channel 理解为数据的通道把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf把 handler 理解为数据的处理工序 工序有多道,合在一起就是 pi…

oracle 对应的JDBC驱动 版本

下载网址:JDBC and UCP Downloads page

整理 【 DBeaver 数据库管理工具 】的一些基础使用

目录 连接设置切换工作空间SQL编辑器(写sql语句)打开方式新建查询(sql编辑器)打开写的 sql 查询(项目浏览器) 备份sql文件查看历史执行语句自动保存sql语句的文件(编辑器)关闭自动生…

(九)JavaWeb后端开发——Servlet

目录 1.Servlet由来 2.Servlet快速入门 3.Servlet执行原理 4.Servlet生命周期 1.Servlet由来 在JaveEE API文档中对Servlet的描述是:可以运行在服务器端的微小程序,但是实际上,Servlet就是一个接口,定义了Java类被浏览器访问…

LLC Power Switches and Resonant Tank 笔记

1.概述 上面是一个典型的LLC电路。注意Lm是励磁电感,就是次级线圈空载时的主变压器电感,据说在计算谐振频率时无需关心。然后,作为DCDC电源,它通过调整谐振频率,来改变输出的电流。负载越大,频率越低&#…

项目模块十三:Util模块

一、项目设计思路 用于之后协议使用的工具类 二、静态成员函数 1、分割函数 static size_t Split(const string &src, const string &sep, vector<string> *array) string.find(const string &str, size_t pos 0) string.substr(size_t pos 0, size_t…