開發一個可以看小姐姐照片的鴻蒙應用 鴻蒙開發入門
效果圖
先整張效果圖,丑點是丑點,但可以用,買不起鴻蒙系統手機的我,只配用虛擬機。
前言
要說目前最火的手機操作系統,要我來看的話那必然是鴻蒙無疑。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() {
@Override
public void onFailure(int code, String errorMessage) {
//http訪問出錯,此部分在主線程中工作,可以更新UI等操做。
MyLabel.error("訪問圖片鏈接接口出錯");
new ToastDialog(getContext()).setText("網絡連接出問題了,請稍后重試").show();
}
@Override
public 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() {
@Override
public void onFailure(int code, String errorMessage) {
//http訪問出錯,此部分在主線程中工作,可以更新UI等操做。
MyLabel.error("訪問圖片鏈接接口出錯");
new ToastDialog(getContext()).setText("網絡連接出問題了,請稍后重試").show();
}
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
//Image組件填充位圖數據,ui界面更新
image.setPixelMap(pixelMap);
pixelMap.release();
}
});
});
}
});
總結
之前沒有自己做過移動端的demo,總之收獲還是不少的,所以期間出了不少問題,需要全部代碼的兄弟們私信就好。