HarmonyOS 鸿蒙Next 使用安全组件保存视频到相册,执行完request.agent.create的方法后没有任何回调与错误
HarmonyOS 鸿蒙Next 使用安全组件保存视频到相册,执行完request.agent.create的方法后没有任何回调与错误
使用安全组件保存视频到相册,执行完request.agent.create的方法后没有任何回调与错误
let config: request.agent.Config = {
action: request.agent.Action.DOWNLOAD,
url: url,
overwrite: true,
method: ‘GET’,
saveas: ‘./’,
mode: request.agent.Mode.BACKGROUND,
gauge: true,
retry: false
};
saveas 这个路径可以直接指定到相册路径吗?以达到直接保存到相册功能
保存下载文件的路径,包括如下几种:
-相对路径 为位于调用方的缓存路径下 "internal://cache"对应context.cacheDir
-应用沙箱目录,只支持到base及其子目录下,如"/data/storage/el1/base/path/to/file.txt"
-file协议路径,必须匹配应用包名,只支持到base及其子目录下,如"file://com.example.test/data/storage/el2/base/file.txt"
这些都不是相册路径
这边有一个使用savebutton保存到相册的示例,不过使用的是request.downloadFile,但是迁移到相册部分的实现是一样的,您可以根据参考demo进行修改:
注意需要添加网络权限,且request.downloadFile默认不允许在同一个文件夹下下载同名文件,多次下载需要更换文件名或者文件目录
"requestPermissions": [{
'name': 'ohos.permission.INTERNET'
}],
demo如下:
import common from '[@ohos](/user/ohos).app.ability.common';
import fs, { ReadOptions, WriteOptions } from '[@ohos](/user/ohos).file.fs';
import { photoAccessHelper } from '[@kit](/user/kit).MediaLibraryKit';
import { BusinessError, request } from '[@kit](/user/kit).BasicServicesKit';
import { buffer } from '[@kit](/user/kit).ArkTS';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
async function readWriteFile(): Promise<void> {
let helper = photoAccessHelper.getPhotoAccessHelper(context);
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
let destFile = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 打开文件
let srcFile = fs.openSync(cacheDir + '/a.jpg', 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);
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
[@State](/user/State) message: string = 'Save Demo';
downLoad(){
try {
request.downloadFile(context, {
url: 'https://copyright.bdstatic.com/vcg/creative/cc9c744cf9f7c864889c563cbdeddce6.jpg[@h_1280](/user/h_1280)',
filePath: cacheDir + '/a.jpg'
}).then((downloadTask: request.DownloadTask) => {
downloadTask.on('complete', () => {
console.info('download complete');
let file = fs.openSync(cacheDir + '/a.jpg', fs.OpenMode.READ_WRITE);
let arrayBuffer = new ArrayBuffer(1024);
let readLen = fs.readSync(file.fd, arrayBuffer);
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info(`The content of file: ${buf.toString()}`);
fs.closeSync(file);
})
}).catch((err: BusinessError) => {
console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
}
}
build() {
RelativeContainer() {
Text(this.message)
.id('SaveDemo')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(()=>{
//先下载图片
this.downLoad()
})
SaveButton({text:SaveDescription.SAVE_IMAGE}).onClick(async (_event: ClickEvent, result: SaveButtonOnClickResult) => {
if (result == SaveButtonOnClickResult.SUCCESS) {
readWriteFile()
}
else {
AlertDialog.show({ message: "设置权限失败" })
}
})
}
.height('100%')
.width('100%')
}
}
在HarmonyOS鸿蒙Next系统中,使用安全组件保存视频到相册时,若执行完request.agent.create
的方法后未收到任何回调或错误,可能的原因及潜在解决方案如下:
-
权限检查:确保应用已正确声明并请求了存储权限,这是访问相册和写入文件的必要前提。
-
回调注册:验证是否在
request.agent.create
调用中正确设置了回调接口。回调方法需明确指定,且实现中需包含对成功与失败情况的处理。 -
任务状态查询:检查
request.agent.create
的执行状态,确认任务是否已正确提交至系统。某些情况下,任务可能因参数错误或系统状态被静默拒绝。 -
日志分析:利用HarmonyOS提供的日志工具,查看应用运行时的详细日志,寻找可能的错误或异常信息。
-
版本兼容性:确认所使用的HarmonyOS版本与API的兼容性,某些功能可能在新旧版本间存在差异。
若上述步骤均无法解决问题,可能是系统级别的bug或特定环境下的异常。此时,建议直接联系官方技术支持。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。