HarmonyOS图片保存相册问题

const pictureBase64Encode = 'UklGRg4LAABxxxxxWAoAAAAQAAAxxxxxx'; 
 
function saveBase64Image() { 
  window.AppFunctions.callNative(createRequestJsonData("SystemUtil", "savePicture", `{"base64Data": "${pictureBase64Encode}" }`)); 
}

HybridSystemService中添加savePicture的方法:

import util from '@ohos.util' 
@HybridMethod() 
public savePicture(jsCallProto: JsCallProto) { 
  let jsonData = JSON.parse(jsCallProto.getJsonData()) as Record<string, string>; 
  let base64Data = jsonData?.base64Data ?? ""; 
  if (base64Data) { 
    let base64 = new util.Base64Helper() 
    let result = base64.decodeSync(base64Data) 
    //这边直接就是调用的fs.openSync,前面会拼上file的目录,如果没有文件夹会创建文件夹 
    let file = FileManager.openStorageFileSync("/picture/"+(new Date()).getMilliseconds()+".jpg") 
    SystemMediaPickerManager.savePicture(result.buffer.slice(0, result.buffer.byteLength), file).then((_) => { 
      jsCallProto.onSuccess("save picture success."); 
    }).catch((err: BusinessError) => { 
      jsCallProto.onFail("save picture fail, err is:" + JSON.stringify(err)); 
    }); 
  } 
} 
public static savePicture(buffer:ArrayBuffer, file: fs.File): Promise<void> { 
  return new Promise((resolve, reject) => { 
  const imageSource : image.ImageSource = image.createImageSource(buffer); 
  const imagePackerApi = image.createImagePacker(); 
  let packOpts : image.PackingOption = { format:"image/jpeg", quality:100 }; 
  imagePackerApi.packToFile(imageSource, file.fd, packOpts).then(()=>{ 
  //移动文件到相册中,需要使用自定义dialog saveButton 
  let dialogHelper = new DialogHelper(); 
  dialogHelper.showCustomDialog(file); 
}).catch((error: BusinessError) => { 
  reject(error); 
}); 
}); 
}

新建DialogHelper的类:

import { promptAction } from '@kit.ArkUI'; 
import { common } from '@kit.AbilityKit'; 
import fs from '@ohos.file.fs' 
import { BusinessError } from '@kit.BasicServicesKit'; 
let customDialogId: number = 0 
@Builder 
function customDialogBuilder() { 
  Column() { 
    Text('保存图片到相册中?').fontSize(10) 
    Row() { 
      SaveButton({ 
        text: SaveDescription.SAVE, 
      }).onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) => { 
        if (result === SaveButtonOnClickResult.SUCCESS) { 
        } else { 
          promptAction.showToast({ message: '设置存储相册权限失败!' }) 
        } 
        promptAction.closeCustomDialog(customDialogId) 
      }) 
      Blank().width(50) 
      Button("取消").onClick(() => { 
        promptAction.closeCustomDialog(customDialogId) 
      }) 
    } 
  }.height(200).padding(5) 
} 
export class DialogHelper { 
  showCustomDialog(file: fs.File) { 
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 
    promptAction.openCustomDialog({ 
      builder: customDialogBuilder.bind(context), 
      onWillDismiss: (dismissDialogAction: DismissDialogAction) => { 
        console.info("reason" + JSON.stringify(dismissDialogAction.reason)) 
        console.log("dialog onWillDismiss") 
        if (dismissDialogAction.reason == DismissReason.PRESS_BACK) { 
          dismissDialogAction.dismiss() 
        } 
        if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) { 
          dismissDialogAction.dismiss() 
        } 
      } 
    }).then((dialogId) => { 
      customDialogId = dialogId 
    }).catch((error:BusinessError) => { 
      console.error("openCustomDialog error: " + error) 
    }) 
  } 
}

问题现象:dialog不显示出来,没办法使用SaveButton,图片没有保存到系统相册中。

HarmonyOS
2024-09-02 08:47:41
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang
分享
微博
QQ
微信
回复
2024-09-02 16:48:24
相关问题
HarmonyOS 保存图片相册问题
61浏览 • 1回复 待解决
HarmonyOS 保存图片相册权限问题
80浏览 • 1回复 待解决
HarmonyOS保存图片到系统相册问题咨询
508浏览 • 1回复 待解决
HarmonyOS 相册保存图片设置title报错
262浏览 • 1回复 待解决
HarmonyOS如何把图片保存到手机相册
371浏览 • 1回复 待解决
如何保存网络图片相册
626浏览 • 1回复 待解决
求大佬告知如何保存图片相册
974浏览 • 1回复 待解决
如何保存本地图片相册
888浏览 • 1回复 待解决
获取网络图片保存相册
1229浏览 • 1回复 待解决
如何保存一张PNG图片相册
1731浏览 • 1回复 待解决
有谁知道如何将图片保存相册
878浏览 • 1回复 待解决
HarmonyOS 保存网络图片至图库问题
76浏览 • 1回复 待解决
HarmonyOS如何将PixelMap保存相册
422浏览 • 1回复 待解决
鸿蒙开发保存页面到相册
6246浏览 • 1回复 待解决
HarmonyOS 保存图片文件异常
64浏览 • 1回复 待解决