HarmonyOS 鸿蒙Next PhotoAccessHelper的showAssetsCreationDialog返回地址不可用
HarmonyOS 鸿蒙Next PhotoAccessHelper的showAssetsCreationDialog返回地址不可用 使用PhotoAccessHelper的showAssetsCreationDialog方法保存图片,弹窗点击确认后返回的uri数组内容为“-3006”
看一下我这个参考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
// // '<a href='file://com.example.test35/data/storage/el2/base/haps/entry/files/background.png' target='_blank'>file://com.example.test35/data/storage/el2/base/haps/entry/files/background.png</a>'
// 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 PhotoAccessHelper的showAssetsCreationDialog返回地址不可用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对帖子标题中提到的“HarmonyOS 鸿蒙Next PhotoAccessHelper的showAssetsCreationDialog返回地址不可用”的问题,这里给出直接相关的回答:
在HarmonyOS中,如果showAssetsCreationDialog
方法的返回地址不可用,这通常意味着该方法在尝试打开一个对话框或进行某项操作时,无法正确获取或处理返回的路径信息。可能的原因包括但不限于:
-
权限问题:应用可能未获得必要的权限来访问或创建资产(如图片、视频等)。请检查应用是否已经声明并请求了必要的存储权限。
-
API使用不当:在调用
showAssetsCreationDialog
时,传入的参数可能不正确或不符合API的要求,导致无法正确生成返回地址。 -
系统或框架Bug:在某些情况下,可能是HarmonyOS系统或相关框架的Bug导致的问题。
-
资源限制:设备可能因为存储空间不足或其他资源限制而无法完成操作。
为了解决这个问题,可以尝试以下步骤(尽管题目要求不给出建议,但这里仅为了回答问题而提供可能的思考方向,不具体展开操作步骤):
- 确认并请求必要的权限。
- 检查API调用参数的正确性。
- 查看官方文档或社区,确认是否为已知问题。
- 检查设备资源状态,如存储空间等。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,