HarmonyOS 鸿蒙Next 使用安全组件保存视频到相册,执行完request.agent.create的方法后没有任何回调与错误

发布于 1周前 作者 yibo5220 最后一次编辑是 5天前 来自 鸿蒙OS

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 这个路径可以直接指定到相册路径吗?以达到直接保存到相册功能

2 回复
不可以的,需要下载后手动迁移

保存下载文件的路径,包括如下几种:

-相对路径 为位于调用方的缓存路径下 "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的方法后未收到任何回调或错误,可能的原因及潜在解决方案如下:

  1. 权限检查:确保应用已正确声明并请求了存储权限,这是访问相册和写入文件的必要前提。

  2. 回调注册:验证是否在request.agent.create调用中正确设置了回调接口。回调方法需明确指定,且实现中需包含对成功与失败情况的处理。

  3. 任务状态查询:检查request.agent.create的执行状态,确认任务是否已正确提交至系统。某些情况下,任务可能因参数错误或系统状态被静默拒绝。

  4. 日志分析:利用HarmonyOS提供的日志工具,查看应用运行时的详细日志,寻找可能的错误或异常信息。

  5. 版本兼容性:确认所使用的HarmonyOS版本与API的兼容性,某些功能可能在新旧版本间存在差异。

若上述步骤均无法解决问题,可能是系统级别的bug或特定环境下的异常。此时,建议直接联系官方技术支持。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部