HarmonyOS 鸿蒙Next showAssetsCreationDialog 保存图片失败

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next showAssetsCreationDialog 保存图片失败
//把cache文件保存到媒体目录中

try { let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); let srcFileUris: Array<string> = [fileUri.getUriFromPath(cacheUrl)]; let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [{ title: isVideo ? ‘保存视频’ : ‘保存图片’, fileNameExtension: isVideo ? ‘mp4’ : ‘jpg’, photoType: isVideo ? photoAccessHelper.PhotoType.VIDEO : photoAccessHelper.PhotoType.IMAGE, subtype: photoAccessHelper.PhotoSubtype.DEFAULT,

// 可选 

}]; let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs); if (desFileUris.length > 0) { return MediaUtil.writeFileToFile(cacheUrl, desFileUris[0]) } } catch (err) { console.error('showAssetsCreationDialog failed, errCode is ’ + err.code + ', errMsg is ’ + err.message); } return false


更多关于HarmonyOS 鸿蒙Next showAssetsCreationDialog 保存图片失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

请参考demo:

import { common } from '@kit.AbilityKit';
import { fileIo as fs, fileUri, ReadOptions, WriteOptions } from '@kit.CoreFileKit'
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import json from '@ohos.util.json';
@Entry
@Component
struct Index {
    @State message: string = 'Hello World';
    filePath: string = '';
    build() {
        Column() {
            Button("复制文件到沙箱")
                .onClick(() => {
                console.log('开始复制文件到沙箱')
                this.copyFile()
                console.log('复制文件到沙箱完成')
            })
            Button('沙箱文件保存到相册')
                .onClick(()=>{
                console.log('开始沙箱文件保存到相册')
                this.syncToSysAlbum(photoAccessHelper.PhotoType.IMAGE,'png', this.filePath)
                })
            Button('沙箱文件保存到相册')
                .onClick(() => {
                console.log('开始沙箱文件保存到相册')
                this.example()
            })
        }
        .height('100%')
        .width('100%')
    }
    copyFile() {
        console.log("开发复制文件")
        let context = getContext(this) as common.UIAbilityContext;
        let srcFileDescriptor = context.resourceManager.getRawFdSync('background.png'); //这里填rawfile文件夹下的文件名(包括后缀)
        let stat = fs.statSync(srcFileDescriptor.fd)
        console.log(`stat isFile:${stat.isFile()}`);
        // 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例
        let pathDir = context.filesDir;
        console.log("沙箱文件目录路径:", pathDir)
        let dstPath = pathDir + "/background.png";
        this.filePath = fileUri.getUriFromPath(dstPath)
        console.log("沙箱文件URI" + this.filePath);
        let dest = fs.openSync(dstPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
        let bufsize = 4096
        let buf = new ArrayBuffer(bufsize)
        let off = 0, len = 0, readedLen = 0
        while (len = fs.readSync(srcFileDescriptor.fd, buf, { offset: srcFileDescriptor.offset + off, length: bufsize })) {
        readedLen += len
        fs.writeSync(dest.fd, buf, { offset: off, length: len })
        off = off + len
        if ((srcFileDescriptor.length - readedLen) < bufsize) {
            bufsize = srcFileDescriptor.length - readedLen
        }   
        }
        fs.close(dest.fd)
    }
    async syncToSysAlbum(fileType: photoAccessHelper.PhotoType, extension: string, ...filePath: string[]) {
        //此处获取的phAccessHelper实例为全局对象,后续使用到phAccessHelper的地方默认为使用此处获取的对象,如未添加此段代码报phAccessHelper未定义的错误请自行添加
        let context = getContext(this);
        let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
        try {
            const srcFileUris: string[] = []
                filePath.forEach((path) => {
                srcFileUris.push(path)
                })
            const config: photoAccessHelper.PhotoCreationConfig[] = []
            config.push({
                title: 'background', // 可选
                fileNameExtension: extension,
                photoType: fileType,
                subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
            })
            console.log("syncToSysAlarm fileUri:" + json.stringify(srcFileUris) + ",config:" + json.stringify(config))
            const desFileUris = await phAccessHelper.showAssetsCreationDialog(srcFileUris, config)
            console.debug(`目标图片 uri is : ${JSON.stringify(desFileUris)}`)
            if (desFileUris.length > 0) {
            for (let index = 0; index < desFileUris.length; index++) {
                this.copyFileContentTo(srcFileUris[index], desFileUris[index])
                }
            }
        } catch (err) {
        console.log("syncToSysAlarm filePath:" + filePath + ",error:" + json.stringify(err))
        }
    }
    async example() {
    console.info('ShowAssetsCreationDialogDemo.');
    let context = getContext(this) as common.UIAbilityContext
    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
    try {
        // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
        // let srcFileUris: Array<string> = [
        // // 实际场景请使用真实的uri
        // // 'file://com.example.test35/data/storage/el2/base/haps/entry/files/background.png'
        // this.filePath
        // ];
        let srcFileUri: Array<string> = [this.filePath]
        console.debug(`图片 uri is : ${JSON.stringify(srcFileUri)}`)
        let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
        {
            title: 'background', // 可选
            fileNameExtension: 'png',
            photoType: photoAccessHelper.PhotoType.IMAGE,
            subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
            }
        ];
        console.log("syncToSysAlarm fileUri:" + JSON.stringify(srcFileUri) + ",config:" +
        JSON.stringify(photoCreationConfigs))
        let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUri, photoCreationConfigs);
        console.debug(`目标图片 uri is : ${JSON.stringify(desFileUris)}`)
        if (desFileUris.length > 0) {
            for (let index = 0; index < desFileUris.length; index++) {
                this.copyFileContentTo(srcFileUri[index], desFileUris[index])
                }
            }
        } catch (err) {
            console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
        }
    }
    /**
    * 复制文件内容到目标文件
    * @param srcFilePath 源文件路径
    * @param destFilePath 目标文件路径
    */
    copyFileContentTo(srcFilePath: string, destFilePath: string) {
        let srcFile = fs.openSync(srcFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
        let destFile = fs.openSync(destFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
        // 读取源文件内容并写入至目的文件
        let bufSize = 4096;
        let readSize = 0;
        let buf = new ArrayBuffer(bufSize);
        let readOptions: ReadOptions = {
            offset: readSize,
            length: bufSize
        };
        let readLen = fs.readSync(srcFile.fd, buf, readOptions);
        while (readLen > 0) {
            readSize += readLen;
            let writeOptions: WriteOptions = {
                length: readLen
            };
            fs.writeSync(destFile.fd, buf, writeOptions);
            readOptions.offset = readSize;
            readLen = fs.readSync(srcFile.fd, buf, readOptions);
        }
        // 关闭文件
        fs.closeSync(srcFile);
        fs.closeSync(destFile);
    }
}

更多关于HarmonyOS 鸿蒙Next showAssetsCreationDialog 保存图片失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


网络图片呢,我下载到沙箱中,用沙箱的uri,一直报401,请问什么原因

针对帖子标题“HarmonyOS 鸿蒙Next showAssetsCreationDialog 保存图片失败”的问题,以下是专业回答:

在HarmonyOS中,如果showAssetsCreationDialog方法用于保存图片时失败,可能的原因包括但不限于:

  1. 权限问题:确保应用已正确申请并获得了存储权限。在HarmonyOS中,存储权限是必需的,用于访问和修改设备的文件系统。

  2. 路径问题:检查指定的保存路径是否有效,且应用具有写入该路径的权限。路径错误或不可写可能导致保存失败。

  3. 图片格式或大小:确认图片格式是否被系统支持,以及图片大小是否在系统限制范围内。过大或不受支持的格式可能导致保存失败。

  4. 系统或API问题:确认使用的HarmonyOS版本是否支持showAssetsCreationDialog方法,以及该方法是否存在已知的bug或限制。

  5. 内存或资源不足:设备内存不足或系统资源紧张也可能导致保存操作失败。

解决上述问题的步骤通常包括检查权限设置、验证路径有效性、调整图片格式和大小、更新系统或API版本,以及确保设备有足够的内存和资源。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部