【HarmonyOS实战开发】在鸿蒙中如何把网络图片保存到相册中

201 篇文章 0 订阅
201 篇文章 0 订阅

配置ohos.permission.WRITE_IMAGEVIDEO权限

首先我们需要配置一下图片写入的权限,注意这个权限是受限权限,在开发过程中使用了这个权限也叫ACL权限,我们需要使用自动签名,但使用的DevEco Studio版本低于4.0 Release,则需要采用手动签名。请根据自己用的版本变换签名方式。

操作步骤

第一步

在module.json5文件中配置ohos.permission.WRITE_IMAGEVIDEO权限。示例代码如下:

{
 "name" : "ohos.permission.WRITE_IMAGEVIDEO",
 "reason": "$string:file_reason_desc",
 "usedScene": {
 "when":"always"
 }
}

具体位置如下:
image.png

配置好了这个权限之后,运行时会报一个错误,说你使用的权限是受限权限,没有签名不能使用。

第二步

那么我们就需要去配置一下签名了,我使用的DevEco Studio版本是5.0.3.100,所以我就直接使用自动签名了,如果有小伙伴使用的是4.0以下的版本,请使用手动签名。具体操作如下: 进入File > Project Structure… > Project > Signing Configs界面,勾选“Automatically generate signature”(如果是HarmonyOS工程,需同时勾选“Support HarmonyOS”),即可完成签名。如果未登录,请先单击Sign In进行登录,然后自动完成签名。
image.png

实现功能代码

配置好了这个权限后,就可以去est文件写代码了,示例代码如下:

`import { abilityAccessCtrl, common } from '@kit.AbilityKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import fs from '@ohos.file.fs';
import { http } from '@kit.NetworkKit';
import { promptAction } from '@kit.ArkUI';
@Entry
@Component struct Index {
@State message: string = 'Hello World'
private appContext: common.Context = getContext(this);
private atManager = abilityAccessCtrl.createAtManager();

build() {
 Row() {
 Column() {
 Text(this.message)
 .fontSize(50)
 .fontWeight(FontWeight.Bold)
 Button("保存图片")
 .margin({ top: 10 })
 .onClick(async (event: ClickEvent) => { 
 //申请权限并保存图片到图库
 try { 
 //申请相册管理模块权限'ohos.permission.WRITE_IMAGEVIDEO' 
 this.atManager.requestPermissionsFromUser(this.appContext, [ 'ohos.permission.WRITE_IMAGEVIDEO' ]).then(async () => { 
 //权限申请成功,保存到图库
 let context = getContext();
 //获取相册管理模块的实例,用于访问和修改相册中的媒体文件
 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 
 // onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回
 let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
 // 创建媒体文件
 console.info('createAsset successfully, uri: ' + uri);
 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE || fs.OpenMode.CREATE);
 let totalSize = 0;
 let httpRequest = http.createHttp();
 httpRequest.on("dataReceive", (data: ArrayBuffer) => {
 let writeLen = fs.writeSync(file.fd, data); 
 totalSize = totalSize + writeLen; });
 httpRequest.requestInStream('https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/homeNew/next- pc.png',
 { method: http.RequestMethod.GET, connectTimeout: 3000, }, httpCode => {
 console.info('requestInStream HTTP CODE is', httpCode) })
 httpRequest.on("dataEnd", () => { 
 fs.close(file);
 promptAction.showDialog({ title: "下载图片结束,并保存至相册", message: `图片大小:${totalSize}字节` }) }) }) 
 } catch (err) { 
 console.error(`requestPermissionsFromUser call Failed! error: ${err.code}`); } }) }
 .width('100%') 
 }
 .height('100%') 
 } 
}

此代码仅供参考,里面保存的图片网址需要更换为咱们自己的噢~

还有最重要的一点,这个功能只能在真机运行时,可以看到保存的图片,在模拟器中保存的图片是空白的,咱也不知道是为啥,有没有懂哥,愿闻其详。

对了,这里没有提到申请网络权限ohos.permission.INTERNET,那是因为它不是受限权限,可直接在module.json5文件中配置即可,不需要其他操作。

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值