在鸿蒙中如何把网络图片保存到相册中

打印 上一主题 下一主题

主题 721|帖子 721|积分 2163

配置ohos.permission.WRITE_IMAGEVIDEO权限

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

第一步

在module.json5文件中配置ohos.permission.WRITE_IMAGEVIDEO权限。示例代码如下:
  1. {
  2.   "name" : "ohos.permission.WRITE_IMAGEVIDEO",
  3.   "reason": "$string:file_reason_desc",
  4.   "usedScene": {
  5.     "when":"always"
  6.   }
  7. }
复制代码
具体位置如下:

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

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

手动签名可参考鸿蒙开辟中央
实现功能代码

配置好了这个权限后,就可以去est文件写代码了,示例代码如下:
  1. import { abilityAccessCtrl, common } from '@kit.AbilityKit';
  2. import { photoAccessHelper } from '@kit.MediaLibraryKit';
  3. import fs from '@ohos.file.fs';
  4. import { http } from '@kit.NetworkKit';
  5. import { promptAction } from '@kit.ArkUI';
  6. @Entry
  7. @Component struct Index {
  8. @State message: string = 'Hello World'
  9. private appContext: common.Context = getContext(this);
  10. private atManager = abilityAccessCtrl.createAtManager();
  11. build() {
  12.    Row() {
  13.      Column() {
  14.        Text(this.message)
  15.        .fontSize(50)
  16.        .fontWeight(FontWeight.Bold)
  17.       Button("保存图片")
  18.       .margin({ top: 10 })
  19.       .onClick(async (event: ClickEvent) => {
  20.           //申请权限并保存图片到图库
  21.         try {
  22.         //申请相册管理模块权限'ohos.permission.WRITE_IMAGEVIDEO'
  23.          this.atManager.requestPermissionsFromUser(this.appContext, [ 'ohos.permission.WRITE_IMAGEVIDEO' ]).then(async () => {
  24.         //权限申请成功,保存到图库
  25.         let context = getContext();
  26.         //获取相册管理模块的实例,用于访问和修改相册中的媒体文件
  27.         let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
  28.         // onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回
  29.         let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
  30.        // 创建媒体文件
  31.        console.info('createAsset successfully, uri: ' + uri);
  32.        let file = fs.openSync(uri, fs.OpenMode.READ_WRITE || fs.OpenMode.CREATE);
  33.       let totalSize = 0;
  34.       let httpRequest = http.createHttp();
  35.        httpRequest.on("dataReceive", (data: ArrayBuffer) => {
  36.       let writeLen = fs.writeSync(file.fd, data);
  37.       totalSize = totalSize + writeLen; });
  38.       httpRequest.requestInStream('https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/homeNew/next- pc.png',
  39.        { method: http.RequestMethod.GET, connectTimeout: 3000, }, httpCode => {
  40.          console.info('requestInStream HTTP CODE is', httpCode) })
  41.           httpRequest.on("dataEnd", () => {
  42.           fs.close(file);
  43.         promptAction.showDialog({ title: "下载图片结束,并保存至相册", message: `图片大小:${totalSize}字节` }) }) })
  44.           } catch (err) {
  45.             console.error(`requestPermissionsFromUser call Failed! error: ${err.code}`); } }) }
  46.           .width('100%')
  47.          }
  48.        .height('100%')
  49.     }
  50. }
复制代码
此代码仅供参考,里面保存的图片网址须要更换为咱们自己的噢~
另有最紧张的一点,这个功能只能在真机运行时,可以看到保存的图片,在模拟器中保存的图片是空缺的,咱也不知道是为啥,有没有懂哥,愿闻其详。
对了,这里没有提到申请网络权限ohos.permission.INTERNET,那是由于它不是受限权限,可直接在module.json5文件中配置即可,不须要其他操作。
这个是近来遇到的一点小题目,现在解决了,赶紧趁还熟悉,就出了这个博客,写鸿蒙的小搭档们,拿走不谢~~,求赞,求赞,求赞,紧张的事变说三遍

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表