【介绍】
在MSDK v5中,pullOriginalMediaFileFromCamera可以拉取照片的原始数据。想要下载一张完整的照片即mediaFile,pullOriginalMediaFileFromCamera的参数中offset设置为0即可。MediaFileDownloadListener将会提供下载的数据回调,你需要自己进行数据流的写入来实现下载功能。
【示例代码】
fun downloadFile(){
//定义保存文件的路径,如无即创建,需注意Android 11开始,共享存储区域的权限被改变。
val dirs: File = File(DiskUtil.getExternalCacheDirPath(ContextUtil.getContext(), mediaFileDir))
if (!dirs.exists()) {
dirs.mkdirs()
}
//定义文件名称,如有即覆盖,需注意Android 11开始,共享存储区域的权限被改变。
val filepath = DiskUtil.getExternalCacheDirPath(ContextUtil.getContext(), mediaFileDir + "/" + mediaFile?.fileName)
val file: File = File(filepath)
if (file.exists()) {
file.delete()
}
//打开字节数据流。
val outputStream = FileOutputStream(file)
val bos = BufferedOutputStream(outputStream)
var beginTime = System.currentTimeMillis()
mediaFile?.pullOriginalMediaFileFromCamera(0 , object :MediaFileDownloadListener {
override fun onStart() {
showProgress()
}
override fun onProgress(total: Long, current: Long) {
updateProgress(current , total)
}
//每一次数据回调,往文件中写入照片原始数据。
override fun onRealtimeDataUpdate(data: ByteArray, position: Long) {
try {
bos.write(data, 0, data.size)
bos.flush()
} catch (e: IOException) {
LogUtils.e("MediaFile" , "write error" + e.message)
}
}
//照片下载完成,关闭字节数据流。
override fun onFinish() {
var spendTime = (System.currentTimeMillis() - beginTime)
var speedBytePerMill : Float? = mediaFile?.fileSize?.div(spendTime.toFloat())
var divs = 1000.div(1024 * 1024.toFloat());
var speedKbPerSecond : Float?= speedBytePerMill?.times(divs)
ToastUtils.showToast(getString(R.string.msg_download_compelete_tips) + "${speedKbPerSecond }Mbps"
+ getString(R.string.msg_download_save_tips) + "${filepath}" )
hideProgress()
try {
outputStream.close()
bos.close()
} catch (error: IOException) {
LogUtils.e("MediaFile" , "close error$error" )
}
}
override fun onFailure(error: IDJIError?) {
LogUtils.e("MediaFile" , "download error$error" )
}
})
}
评论
0 条评论
请登录写评论。