开发一个可以看小姐姐照片的鸿蒙应用 鸿蒙开发入门

  • 效果图
  • 前言
  • 实现思路
  • 具体实现
    • 建立项目
    • 建立http链接拿取图片链接
      • 设置网络权限
      • 设置允许http请求
      • 发起http请求,并获取返回的数据
        • json数据解析
        • 发起请求,获得响应内容
      • 将获取的图片链接放入内存中
    • 获取网络图片并展示在页面上
      • http请求工具类
      • 字节流转图片工具类
      • 图片展示在页面
  • 总结

效果图

先整张效果图,丑点是丑点,但可以用,买不起鸿蒙系统手机的我,只配用虚拟机。

前言

要说目前最火的手机操作系统,要我来看的话那必然是鸿蒙无疑。16号刚刚结束了第五次鸿蒙内测,在看到这次的内测名单之后,居然有970的机器,这是不是说明俺这手里奋战了三年的荣耀play也可以生鸿蒙了,但现实是970三孤儿果然名不虚传,还是没有我们。

那么言归正传,这次突然想做一个基于鸿蒙的小demo,然后又想到了我之前爬取的小姐姐图片链接还没有用武之地,这俩是不是可以结合一下?上次有这样的想法还是上一次,那么就做一个看小姐姐的小demo吧,开整开整。

实现思路

之前在网上看到有直接把图片下载下来然后放进项目中的,这个很明显不适合我,不仅占的空间大,而且图片还得手动更新,这可不行

我们采用的是调用图片链接接口获取所有的图片链接,一个链接只是一个字符串要比图片占的空间小太多了,将这些链接存储在内存中,有兴趣的可以存在数据库里,然后每次随机获取一条链接就可以,由这条链接获取图片信息,将图片渲染到页面就可以。

整个流程简单的一塌糊涂,总结一下就是

  • 拿取图片链接
  • 由链接获取图片信息
  • 渲染至显示页面

具体实现

建立项目

这个比较基础了,就不说了,如果不大了解的兄弟们,直接去官方文档看看就可以,建立流程非常简单。

建立http链接拿取图片链接

设置网络权限

我们需要访问网络,就必须要设置网络权限,来到config.json文件中,添加以下内容

 "reqPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "com.wxr.xiaowpic.DataAbilityShellProvider.PROVIDER"},{"name": "ohos.permission.GET_NETWORK_INFO"},{"name": "ohos.permission.SET_NETWORK_INFO"}],

直接在module中添加如上内容,如下图

设置允许http请求

这里注意,重点哈,鸿蒙默认的是发起https请求,因此如果我们发起http请求是会报错的,这里需要修改一下
还是在config.json下,在deviceConfig中添加以下内容

"default": {"network": {"cleartextTraffic": true}}

如下图所示,这里吐槽一下,我再寻找怎么设置允许发起http响应的时候,发现好多文章都一样,而且都不适用于我这个项目,还有的人复制别人的文章也能复制错,绝了。

发起http请求,并获取返回的数据

json数据解析

这里要使用到alibaba的fastjson工具类,在build.gradle引入如下依赖

implementation group: 'com.alibaba', name: 'fastjson', version: '1.2.73'

如下图所示

发起请求,获得响应内容

这里使用的是大佬封装好的专门用于请求接口的一个工具,ZZRHttp,同样需要引入依赖,引入过程和上面fastjson引入过程一致。

implementation 'com.zzrv5.zzrhttp:ZZRHttp:1.0.1'

获取接口数据的具体实现如下,这里解释一下,https://2fd8e89d.cpolar.io/getAll这个接口地址,是获取图片链接的,是我本地的服务,所以大家如果需要的话,我可以把我的服务代码发给你们,包括存储图片链接的数据库。

  ZZRHttp.get("https://2fd8e89d.cpolar.io/getAll", new ZZRCallBack.CallBackString() {@Overridepublic void onFailure(int code, String errorMessage) {//http访问出错,此部分在主线程中工作,可以更新UI等操做。MyLabel.error("访问图片链接接口出错");new ToastDialog(getContext()).setText("网络连接出问题了,请稍后重试").show();}@Overridepublic void onResponse(String response) {//http访问成功,此部分在主线程中工作,可以更新UI等操作。MyLabel.info("获取图片链接成功");new ToastDialog(getContext()).setText("正在初始化,稍后").show();//将字符串转换为json对象JSONObject jsonObject = JSONObject.parseObject(response);//将其中返回的图片链接转换为列表JSONArray info = (JSONArray) jsonObject.get("info");MyLabel.info("拿取数据量:" + info.size());info.forEach(item -> {srcs.add(item.toString());});new ToastDialog(getContext()).setText("初始化成功,开始你的快乐吧").show();MyLabel.info("内存中数据数量" + srcs.size());}});

将获取的图片链接放入内存中

就是声明一个静态列表变量,目的是为了下次获取图片链接时可以直接在这里拿取图片链接

public void initData() {PicDao picDao = new PicDaoImpl(getContext());//使用后台线程进行初始化TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);refreshUITask.syncDispatch(() -> {//            List<PicSrc> list = picDao.list();//判断内存中有无数据if (srcs.size() == 0) {MyLabel.info("内存中没东西,第一次打开应用");MyLabel.info("调用图片接口获取图片链接列表");ZZRHttp.get("https://2fd8e89d.cpolar.io/getAll", new ZZRCallBack.CallBackString() {@Overridepublic void onFailure(int code, String errorMessage) {//http访问出错,此部分在主线程中工作,可以更新UI等操做。MyLabel.error("访问图片链接接口出错");new ToastDialog(getContext()).setText("网络连接出问题了,请稍后重试").show();}@Overridepublic void onResponse(String response) {//http访问成功,此部分在主线程中工作,可以更新UI等操作。MyLabel.info("获取图片链接成功");new ToastDialog(getContext()).setText("正在初始化,稍后").show();JSONObject jsonObject = JSONObject.parseObject(response);JSONArray info = (JSONArray) jsonObject.get("info");MyLabel.info("拿取数据量:" + info.size());info.forEach(item -> {srcs.add(item.toString());});new ToastDialog(getContext()).setText("初始化成功,开始你的快乐吧").show();MyLabel.info("内存中数据数量" + srcs.size());}});} else {MyLabel.info("已经有内容了");}});}

获取网络图片并展示在页面上

http请求工具类

这个类的主要作用就是发起http请求,并返回响应字节流,其实就是获取图片的字节流,代码如下

package com.wxr.xiaowpic.util;import com.wxr.xiaowpic.label.MyLabel;
import com.zzrv5.mylibrary.ZZRCallBack;
import com.zzrv5.mylibrary.ZZRHttp;
import ohos.hiviewdfx.HiLog;
import ohos.utils.net.Uri;import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class HttpUtils {//url就是要访问的网络资源,methodType就是请求方式public static InputStream getInput(String url,String methodType){InputStream inputStream = null;try {URL url1=new URL(url);HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();urlConnection.setRequestMethod(methodType);urlConnection.connect();int rescode=urlConnection.getResponseCode();if(rescode==HttpURLConnection.HTTP_OK){inputStream=urlConnection.getInputStream();}} catch (Exception e) {HiLog.error(MyLabel.LABEL_LOG,e.getMessage());HiLog.error(MyLabel.LABEL_LOG,e.getCause().toString());}return inputStream;}}

字节流转图片工具类

没啥好说的,复制就可以用

package com.wxr.xiaowpic.util;import com.wxr.xiaowpic.label.MyLabel;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;import java.io.InputStream;public class ImageUtils {private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "XiaoW");public static PixelMap createPixelMap(String imageUrl) {//获取图片字节流信息InputStream inputStream = HttpUtils.getInput(imageUrl,"GET");PixelMap pixelMap=null;ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions();sourceOptions.formatHint = "image/jpeg";HiLog.info(MyLabel.LABEL_LOG,(inputStream==null)+"");try {ImageSource imageSource = ImageSource.create(inputStream,sourceOptions);pixelMap = imageSource.createPixelmap(null);}catch (Exception e){HiLog.info(LABEL_LOG,e.getMessage());}return pixelMap;}
}

图片展示在页面

这里采用的是按钮点击之后进行图片的渲染,其中图片链接是在我们获取的图片链接随机读取一个,然后将该照片渲染至页面

 button.setClickedListener(new Component.ClickedListener() {@Overridepublic void onClick(Component component) {TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);refreshUITask.syncDispatch(() -> {//在链接列表中随机取一个数据int index = (int) (Math.random() * srcs.size());MyLabel.info(srcs.get(index));String url=srcs.get(index);MyLabel.info("开始获取图片");//访问线上图片PixelMap pixelMap = ImageUtils.createPixelMap(url);getContext().getUITaskDispatcher().asyncDispatch(new Runnable() {@Overridepublic void run() {//Image组件填充位图数据,ui界面更新image.setPixelMap(pixelMap);pixelMap.release();}});});}});

总结

之前没有自己做过移动端的demo,总之收获还是不少的,所以期间出了不少问题,需要全部代码的兄弟们私信就好。

【HarmonyOS】开发一个可以看小姐姐的鸿蒙应用 鸿蒙开发入门相关推荐

  1. ***JAVA*和*Eclipse*开发一个换装小游戏**

    JAVA和Eclipse开发一个换装小游戏** 家有一女如有一宝,最近女朋友的少女心有点爆棚,作为一个计算机专业的人,我的情商简直是低到吓人,但是我还是想到了,亲自给女朋友做一个换装的小游戏,来满足女 ...

  2. 从0到1使用python开发一个半自动答题小程序

    从0到1使用python开发一个半自动答题小程序 前言 最近每天都有玩微信读书上面的每日一答的答题游戏,完全答对12题后,可以瓜分无限阅读卡.但是从小就不太爱看书的我,很难连续答对12道题,由此,产生 ...

  3. Android | 教你如何开发一个拍照翻译小程序

    华为机器学习服务(ML Kit) 提供机器学习套件,为开发者应用机器学习能力开发各类应用提供优质体验.得益于华为长期技术积累,ML Kit 为开发者提供简单易用.服务多样.技术领先的机器学习能力,助力 ...

  4. 安卓开发实战,用HMS MLKit华为机器学习服务开发一个拍照翻译小程序

    文章目录 引子 想象中的旅游 实际中的旅游 太难了 拍照翻译帮你忙 文本识别 翻译 拍照翻译APP开发实战 1 开发准备 1.1 在项目级gradle里添加华为maven仓 1.2 在应用级的buil ...

  5. vue+uni-app商城实战 | 第一篇:从0到1快捷开发一个商城微信小程序,无缝接入OAuth2实现一键授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

  6. 怎么开发一个自助打印机小程序

    如果你想开发一个自助打印机小程序,你可以以下这些步骤: 了解打印机技术:需要了解打印机的工作原理和通信协议,以便与小程序进行通信. 选择开发语言:可以使用诸如JavaScript.Python等常用编 ...

  7. 如何利用spring框架来开发一个简单的小项目——书店项目

    这里我将用spring来开发一个简单的书店项目 Step1:所用到的开发软件为 idea , 所用到的jar包为 这些jar的下载可在 官网 下载,选择5.2.6版本下载,不会的在下面评论私信 Ste ...

  8. 编程语言用 Java 开发一个打飞机小游戏(附完整源码)

    编程语言用 Java 开发一个打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过 ...

  9. 某大厂程序员求助:认识一个不错的小姐姐,却得知对方竟有四个兄弟姐妹!想放弃,对方却穷追不舍,怎么办?...

    独生子女愿意和家里兄弟姐妹很多的人结婚吗?有人觉得兄弟姐妹少了麻烦少,有人觉得兄弟姐妹多了养老方便,事实如何呢? 一位美团程序员发帖求助:在网上认识一个女生,颜值还可以,聊了一周也挺正常,今天见面吃饭 ...

最新文章

  1. SAP系统安装技术要求
  2. delete和delete[]的区别
  3. Mysql 从库跳过
  4. 海龟绘图小动物_被解救海龟经野化训练后放归大海,这一幕让人惊叹不已
  5. 举个对联广告随机播放的例子
  6. Echarts数据可视化series-graph关系图,开发全解+完美注释
  7. sqlserver数据库布尔盲注_7.sql注入基础1
  8. linux安装mysql配置,linux安装mysql,配置mysql文件
  9. 小波变换——哈尔小波,Haar
  10. 记一次自动提醒钉钉机器人的诞生
  11. warcraft3Viewer模型导入到3dsmax到Unity
  12. 赫兹的单位换算_单位换算大全!
  13. SQLmap————10、sqlmap详细命令
  14. 思维导图学习3——思维导图示例
  15. MySQL中的竖列变横列
  16. 请先切换至Wxml Pannel的解决方法
  17. ffmpeg 查看bayer rg8 \ bg8 像素格式图片方法
  18. 使用 git tag 给项目打标签
  19. 利用电阻分压网络测量电池电压注意事项
  20. python高级算法与数据结构:“你如何压缩一部英文著作”,一道来自大厂的真实面试题

热门文章

  1. VirtualBox 安装 Ubuntu虚拟机 显卡驱动
  2. Verilog HDL程序笔记2
  3. 充电宝是如何盗取你的个人隐私的?
  4. 案例分析|爆款品牌完美日记的KOL投放策略
  5. 只用1年时间,机械品牌在国际电焊界名声大噪,看他是如何玩转kol网红营销的
  6. 支付宝技术专家李战斌:安防视频行为分析系统的技术演进及应用场景 | 2018FMI人工智能与大数据高峰论坛(深圳站)
  7. ​生鲜也能卖尾货了?
  8. Oracle存储过程以及游标嵌套实际使用
  9. 终极解决vc++1935安装错误办法
  10. 1. 将数据导入到前置数据库中(MySQL)