手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)

简介

        本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历,此篇为《微信聊天界面》项目,实现功能有

1、聊天信息功能,包括图片、文字

2、发送定位功能

3、选择发送本机图片功能

4、拍照并发送图片功能

        如果在真机调试请将config文件中包名换成自己的应用包名即可,申请权限有文件读写、位置获取、相机调用、麦克风调用。

之前文章


手把手教你用鸿蒙HarmonyOS实现微信聊天界面(一)_hys1124388788的博客-CSDN博客

聊天界面效果如图

图片选择效果如图

图片获取 

        本篇讲关于图片的获取。一种方式是在项目中放置静态资源,另一种则是从本机中获取图片。

第一种

        第一种方式使用很简单,只需要在Image组件添加src属性即可。

 <Imageohos:id="$+id:image_message"ohos:width="match_content"ohos:image_src="$media:rick_c137"ohos:height="match_content"ohos:scale_mode="zoom_center"ohos:background_element="$graphic:message_background"ohos:left_margin="15vp"ohos:left_padding="15vp"ohos:right_padding="15vp"ohos:right_margin="15vp"ohos:top_margin="15vp"ohos:top_padding="15vp"ohos:bottom_margin="15vp"ohos:bottom_padding="15vp"ohos:margin="5vp"/>

第二种

        第二种的使用场景更加普遍,是根据图片文件的uri来访问媒体资源转换为PixelMap对象传给Image组件实现的。

 Component container = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_image_message_list_item, null, false);Image image = (Image) container.findComponentById(ResourceTable.Id_image_message);DataAbilityHelper helper=DataAbilityHelper.creator(context);ImageSource imageSource;Uri uri = Uri.parse(aMessage.getMessage());FileDescriptor fd = null;try {fd = helper.openFile(uri, "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图PixelMap pixelMap = imageSource.createPixelmap(null);image.setPixelMap(pixelMap);imageSource.release();helper.release();return container;

获取Uri

        如何获取图片的Uri呢?是通过DataAbilityHelper这个类查询本机的资源(参考官方文档文档中心),媒体存储相关类AVStorage类中AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI是获取用于处理图像媒体信息的Uri,视频资源也类似,根据查询结果获取到的资源id拼接处Uri

Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, String.valueOf(id));

项目中获取图片URI资源的类

public class PictureManager {private static final String TAG = PictureManager.class.getSimpleName();private List<Uri> imagePathElements = new ArrayList<>();private Context context;/*** The construction method of this class** @param context Context*/public PictureManager(Context context) {this.context = context;loadFromMediaLibrary(context);}private void loadFromMediaLibrary(Context context) {Uri remoteUri = AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI;DataAbilityHelper helper = DataAbilityHelper.creator(context, remoteUri, false);try {ResultSet resultSet = helper.query(remoteUri, null, null);LogUtil.info(TAG, "The result size: " + resultSet.getRowCount());processResult(resultSet);resultSet.close();} catch (DataAbilityRemoteException e) {LogUtil.error(TAG, "Query system media failed.");} finally {helper.release();}}private void processResult(ResultSet resultSet) {while (resultSet.goToNextRow()) {String path = resultSet.getString(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.DATA));String title = resultSet.getString(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.TITLE));String id = resultSet.getString(resultSet.getColumnIndexForName(AVStorage.Images.Media.ID));Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, String.valueOf(id));LogUtil.info(TAG, "The title is: " + title);LogUtil.info(TAG, "The path is: " + path);LogUtil.info(TAG, "The id is: " + id);LogUtil.info(TAG, "The uri is: " + uri);imagePathElements.add(uri);}}public List<Uri> getimageElements() {LogUtil.info(TAG, "The size is: " + imagePathElements.size());return imagePathElements;}
}

Uri转图片

         ​​​​​​具体怎么选择图片是通过ListContiner组件将图片按行展示在手机上,通过添加图片的点击方法调用发送消息方法将图片发出。

        如何将Uri显示为图片?在鸿蒙中Image组件可通过调用setPixelMap方法设置,参数是PixMap对象。可以通过ImageSource根据FileDescriptor 创建位图

DataAbilityHelper helper=DataAbilityHelper.creator(slice.getContext());
ImageSource imageSource;
FileDescriptor fd = null;
fd = helper.openFile(uri, "r");
imageSource = ImageSource.create(fd, null);
PixelMap pixelMap = imageSource.createPixelmap(null);
image.setPixelMap(pixelMap);

        以下是在项目中将图片一行三张展示所以Uri采用数组存储,如果只想显示一张将数组换为单个对象即可。

DataAbilityHelper helper=DataAbilityHelper.creator(slice.getContext());//定义图片来源对象ImageSource imageSource;Uri[] uris = imageLineItem.getUris();FileDescriptor fd = null;image1.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[0]),"image");mainAbilitySlice.getDialog().destroy();});try {fd = helper.openFile(uris[0], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图PixelMap pixelMap = imageSource.createPixelmap(null);image1.setPixelMap(pixelMap);imageSource.release();helper.release();

ListContiner的内容实体类

public class ImageLineItem {private int index;private Uri[] uris;public ImageLineItem(int index) {this.index = index;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public Uri[] getUris() {return uris;}public void setUris(Uri[] uris) {this.uris = uris;}
}

Provider类

public class ImageLineProvider extends BaseItemProvider {private static final String TAG = ImageLineProvider.class.getSimpleName();private List<ImageLineItem> list;private AbilitySlice slice;private MainAbilitySlice mainAbilitySlice;public void setMainAbilitySlice(MainAbilitySlice mainAbilitySlice){this.mainAbilitySlice = mainAbilitySlice;}public ImageLineProvider(List<ImageLineItem> list, AbilitySlice slice) {LogUtil.info(TAG,"list.size() : "+list.size());this.list = list;this.slice = slice;}@Overridepublic int getCount() {return list == null ? 0 : list.size();}@Overridepublic Object getItem(int position) {if (list != null && position >= 0 && position < list.size()){return list.get(position);}return null;}@Overridepublic long getItemId(int position) {return position;}private Component getItemComponent(int position) {return getComponent(position);}private Component getComponent(int position) {LogUtil.info(TAG,"list.size()"+list.size());final Component cpt;cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_images_line, null, false);ImageLineItem imageLineItem = list.get(position);Image image1,image2,image3;image1 = (Image) cpt.findComponentById(ResourceTable.Id_image1);image2 = (Image) cpt.findComponentById(ResourceTable.Id_image2);image3 = (Image) cpt.findComponentById(ResourceTable.Id_image3);DataAbilityHelper helper=DataAbilityHelper.creator(slice.getContext());//定义图片来源对象ImageSource imageSource;Uri[] uris = imageLineItem.getUris();FileDescriptor fd = null;image1.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[0]),"image");mainAbilitySlice.getDialog().destroy();});image2.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[1]),"image");mainAbilitySlice.getDialog().destroy();});image3.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[2]),"image");mainAbilitySlice.getDialog().destroy();});try {fd = helper.openFile(uris[0], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图PixelMap pixelMap = imageSource.createPixelmap(null);image1.setPixelMap(pixelMap);imageSource.release();helper.release();try {fd = helper.openFile(uris[1], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图pixelMap = imageSource.createPixelmap(null);image2.setPixelMap(pixelMap);imageSource.release();helper.release();try {fd = helper.openFile(uris[2], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图pixelMap = imageSource.createPixelmap(null);image3.setPixelMap(pixelMap);imageSource.release();helper.release();return cpt;}@Overridepublic Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) {return getItemComponent(position);}
}

        到此图片获取的方式讲完了,下篇讲前边图片中展示的效果怎么实现。

Gitee链接
WeChatPage: 鸿蒙版微信界面

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙2.0开始推送,华为OS首次登陆手机,亮点槽点都在这里

贾浩楠 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 很快啊&#xff01;华为鸿蒙2.0&#xff0c;这就来了。 目前&#xff0c;鸿蒙2.0已经开放公测&#xff0c;不少华为用户已经开始上手体验了。 据华为消费者业务软件部总裁王成录表示&#xff0c;今年6月初&#xff0c;华为…

2023年人工智能行业研究报告

第一章 行业概况 1.1 定义和分类 人工智能&#xff08;ArtificialIntelligence, AI&#xff09;是一个广泛的计算机科学分支&#xff0c;它致力于创建和应用智能机器。在更深入的层次上&#xff0c;人工智能可以被理解为以下几个方面&#xff1a; 学习和适应&#xff1a;人工…

梭哈大模型,阿里云成了跟风者?

伴随AI大模型潘多拉魔盒打开&#xff0c;云市场GameChanger已到来。对阿里云这个昔日老大哥而言&#xff0c;从“领先者”变为“跟风者”&#xff0c;是否还有机会去重塑行业规则&#xff1f; 这可能是张勇全面掌舵阿里巴巴7年以来&#xff0c;事关未来最重要的一次“梭哈”。 …

国产AI算力芯片简介-2023年

Q&#xff1a;GPGPU和ASIC芯片在AI算力中分别承担什么样的角色&#xff1f; A&#xff1a;早期开放框架基于GPGPU架构实现&#xff0c;因此软件生态更为成熟&#xff0c;对于初级客户来说&#xff0c;上手使用更加方便。GPGPU的通用性也更好&#xff0c;架构更加适合AI中针对模…

美团已开始研发大模型 ;华为MetaERP全球上线;金山软件一季度净利润同比增长96%丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 阿里云智能被曝进行组织岗位和人员优化&#xff0c;补偿标准为N11 近日&#xff0c;一位阿里云智能内部人士透露&#xff1a;“每年公司会进行正常的组织岗位和人员优化。此次人员调整的时间为5月份&#xff0c…

在Centos 7搭建Docker环境

一、环境部署包准备 1、Centos 7版本的操作系统并支持SSH访问 2、下载 jdk-8u60-linux-x64.rpm 3、下载 apache-tomcat-8.0.30.tar.gz 二、Docker安装 1、修改yum源&#xff0c;制定Docker官方的yum源 vi /etc/yum.repos.d/docker.repo [dockerrepo] nameDocker Repository…

巴比特 | 元宇宙每日必读:WPS接入AI能力,微软小冰计划年底前克隆10万虚拟人,游戏巨头如坐针毡,元宇宙应用至少有6亿月活...

摘要&#xff1a;元宇宙天天被“死亡”&#xff0c;堡垒之夜老板撰文奋起反击&#xff1a;元宇宙应用至少已有6亿月活用户&#xff0c;他们出没于Fortnite、Minecraft、Roblox、The Sandbox 和 VR Chat 等元宇宙虚拟世界中。显然&#xff0c;他并不认同“元宇宙已死”的说法。他…

家长必读: ChatGPT让孩子在快乐成长中收获成功!

作为一个现代的青年家长&#xff0c;我们都深知家庭教育的重要性以及其中的挑战。在这个快节奏的社会中&#xff0c;我们需要面对工作压力、时间限制以及教育资源的匮乏等问题。然而&#xff0c;随着科技的进步&#xff0c;作为万能智能助手ChatGPT将成为我家庭教育的得力帮手。…

GPT4论文翻译 by GPT4 and Human

GPT-4技术报告解读 文章目录 GPT-4技术报告解读前言&#xff1a;摘要1 引言2 技术报告的范围和局限性3 可预测的扩展性3.1 损失预测3.2 人类评估能力的扩展 4 能力评估4.1 视觉输入 !!! 5 限制6 风险与缓解&#xff1a;7 结论 前言&#xff1a; 这篇报告内容太多了&#xff01…

吴恩达 Chatgpt prompt 工程--1.Guidelines

课程链接 Setup #安装 !pip install openai#设置key !export OPENAI_API_KEYsk-... # or #import openai #openai.api_key "sk-..."import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv())openai.api_key os.geten…

使用 ChatGPT 生成代码的提示

ChatGPT 是一个真正的超能力&#xff0c;不仅在编写方面&#xff0c;而且在生成代码方面。开始使用 ChatGPT 很简单&#xff0c;但如果你想充分利用它&#xff0c;那么你需要学习如何制作好的提示。 提示是您为 ChatGPT AI 模型提供的说明或讨论主题&#xff0c;用于响应。它可…

招聘海报制作可以用什么软件,有什么免费模板?

眼看六月毕业季就来了&#xff0c;对于企业来说无疑是新的招聘黄金时间&#xff0c;制作一张合格的招聘海报尤为重要。一张专业的招聘海报所用的软件最佳推荐无疑就是photoshop了&#xff0c;但对于大多数人来说&#xff0c;photoshop并非一朝一夕就能熟练运用的。 因此易图网…

推荐几个好用的文字生成创意绘画软件,帮你轻松拓展创意

如果我们是一位设计师&#xff0c;可能需要为客户制作一些创意图画&#xff0c;但是如果没有足够的绘画技巧和经验&#xff0c;那么我们长时间的进行绘画创作可能不仅体现不出创意&#xff0c;还不能够让客户满意。而且有些时候会觉得自己的绘画风格比较的局限&#xff0c;难以…

4款超实用绘图软件

对于新手来说&#xff0c;很多人认为绘图软件需要一定基础的设计功底&#xff0c;但其实也不完全是&#xff0c;在网上有很多非常实用的绘图软件可以迅速的帮助我们解决工作中的绘图问题&#xff0c;以下4款是这两年我的小伙伴们用的最多的&#xff0c;推荐给大家。 亿图图示 …

这 7 款程序员免费在线画图工具,贼好用!

点击关注公众号&#xff1a;互联网架构师&#xff0c;后台回复 2T获取2TB学习资源&#xff01; 上一篇&#xff1a;Alibaba开源内网高并发编程手册.pdf 都说一图胜千言&#xff0c;一个程序员如果能画的一手好图&#xff0c;无论是在产品分析、方案选项、还是技术交流&#xff…

智能写作软件-免费智能写作文章内容软件

智能写作软件&#xff0c;什么是智能写作软件。随着互联网的发展&#xff0c;人工智能的崛起市面上出现了不少的智能写作软件&#xff0c;但是不少的智能写作软件的原创度基本都低于百分之30&#xff0c;今天给大家分享一款免费的人工智能写作软件&#xff0c;支持自动全网采集…

推荐一款免费在线高效作图工具

作者&#xff1a; kim 来源&#xff1a; kimshareclub微信公众号 今天要分享的这款工具那个叫厉害了&#xff0c;从标题就可以看得出来&#xff0c;这也是目前最走心的标题了。为了博取一点流量也是各种操碎了心&#xff0c;希望大家纯粹是因为看到标题而进来的。说句实在话&a…

独家 | AI教父Geoffery Hinton:我开发的技术,为什么现在让我如此害怕

作者&#xff1a;Will DOuglas Heaven翻译&#xff1a;殷之涵 校对&#xff1a;孙韬淳本文约4500字&#xff0c;建议阅读9分钟 本文为你分享 AI 教父在谷歌工作了十年之后决定辞职的原因。 那天&#xff0c;我在Geoffrey Hinton的家中&#xff08;位于北伦敦的一条漂亮街道&am…

【人工智能】AI 教父 Hinton MIT 万字访谈: 人类 可能只是 AI 演化过程中的一个过渡阶段

目录 离开谷歌是为了向世人警醒AI风险 离开谷歌的原因: GPT-4已经具

苹果公司注册成立 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 1 月 3 日&#xff0c;在 2001 年的今天&#xff0c;英特尔发布 Intel 1.3GHz Pentium 4 处理器&#xff1b;英特尔的 Pentium 4 系列曾在最初发布时表现令人失…