『牛角书』Ark UI的文件下载后存储在图库 原创

发布于 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 就是应用上下文
『牛角书』Ark UI的文件下载后存储在图库-开源基础软件社区
在MainAbility中赋值
『牛角书』Ark UI的文件下载后存储在图库-开源基础软件社区

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
4
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐