回复
『牛角书』Ark UI的文件下载后存储在图库 原创
hys1124388788
发布于 2022-4-15 21:50
浏览
1收藏
比如调用JS的api下载一个视频
downloadVideo(){
request.download({ url: VIDEO_URL},
(err, data) => {
if (err) {
console.error('Failed to request the download. Cause: ' + JSON.stringify(err));
return;
}
prompt.showToast({
message: data
})
data.on('progress', this.download_callback);
});
},
download_callback(receivedSize, totalSize) {
console.info("download receivedSize:" + receivedSize + " totalSize:" + totalSize);
var that = this;
if(receivedSize>=totalSize){
prompt.showToast({
message: '开始复制'
})
this.utilInterface = createLocalParticleAbility('edu.zut.hys.jsskateboard.util.UtilServiceAbility');
this.utilInterface.saveVideo('internal://cache/'+VIDEO_URL,result => {
console.info(this.lable+result)
})
}
},
下载文件的在internal://cache/下,绝对路径获得为/data/user/0/包名/cache/文件名
下载之后并不能在图库中找到该文件,但通过鸿蒙自带的文件浏览器可以找到,在 /我的手机/Android/data/应用包名/ 目录下
接下来说一下如何将文件存在图库中
首先经过测试,直接的文件IO通过绝对路径不可以,需要通过DataAbility存储。
在PA中编写一个保存视频的方法,在调用JS API下载(前边代码监听文件下载回调方法中文件下载大小)完成后调用该方法将文件拷贝到多媒体文件库中
public void saveVideo(String path, Callback callback) throws IOException {
HiLog.info(LABEL_LOG,"开始"+StaticV.context.getCacheDir().getAbsolutePath());
DataAbilityHelper helper=DataAbilityHelper.creator(StaticV.context);
//声名一个要保存的值
ValuesBucket values = new ValuesBucket();
HiLog.info(LABEL_LOG,"helper");
//比如http://xxx/xxx/文件名.文件类型
String[] paths = path.split("/");
//获取文件名
String fileName = paths[paths.length-1];
HiLog.info(LABEL_LOG,StaticV.context.getCacheDir().getAbsolutePath()+"/"+fileName);
//获取cache目录下的下载文件的输入流
FileInputStream srcfis = new FileInputStream(StaticV.context.getCacheDir().getAbsolutePath()+"/"+fileName);
HiLog.info(LABEL_LOG,"fis");
//通过spilt函数截取待创建的文件名
values.putString(AVStorage.Downloads.DISPLAY_NAME, fileName.split("\\.")[0]);
//通过spilt函数截取文件格式
values.putString(AVStorage.Downloads.MIME_TYPE, "video/"+fileName.split("\\.")[1]);
//向DataAbilityHelper中插入文件信息,插入成功后会返回文件的id
try {
int id = helper.insert(AVStorage.Downloads.EXTERNAL_DATA_ABILITY_URI, values);
//通过id拼接文件的uri
Uri targeruri = Uri.appendEncodedPathToUri(AVStorage.Downloads.EXTERNAL_DATA_ABILITY_URI, String.valueOf(id));
//获取文件描述符
FileDescriptor fd = helper.openFile(targeruri, "rw");
//根据文件描述符获取输出流
FileOutputStream fos = new FileOutputStream(fd);
HiLog.info(LABEL_LOG,"fos");
int length;
byte[] buffer = new byte[1024];
while((length = srcfis.read(buffer))!=-1){
fos.write(buffer,0,length);
}
HiLog.info(LABEL_LOG,"写入完成");
fos.close();
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
}
srcfis.close();
callback.reply(res);
}
代码中 StaticV.context 就是应用上下文
在MainAbility中赋值
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
赞
4
收藏 1
回复
相关推荐