package cn.sinata.xldutils.utils
|
|
import android.graphics.Bitmap
|
import android.media.MediaMetadataRetriever
|
import android.media.ThumbnailUtils
|
import android.provider.MediaStore
|
import java.io.*
|
import java.util.*
|
|
/**
|
* Created on 2018/1/12.
|
*/
|
object FileUtils {
|
|
fun writeToDisk(inputStream: InputStream?, path: String): Boolean {
|
try {
|
val futureStudioIconFile = File(path)
|
var outputStream: OutputStream? = null
|
try {
|
val fileReader = ByteArray(4096)
|
var fileSizeDownloaded: Long = 0
|
outputStream = FileOutputStream(futureStudioIconFile)
|
while (true) {
|
val read = inputStream!!.read(fileReader)
|
if (read == -1) {
|
break
|
}
|
outputStream.write(fileReader, 0, read)
|
fileSizeDownloaded += read.toLong()
|
}
|
outputStream.flush()
|
return true
|
} catch (e: IOException) {
|
return false
|
} finally {
|
if (inputStream != null) {
|
inputStream.close()
|
}
|
if (outputStream != null) {
|
outputStream.close()
|
}
|
}
|
} catch (e: IOException) {
|
return false
|
}
|
|
}
|
|
/**
|
* 获取视频第一帧
|
* @param videoPath
|
* @return
|
*/
|
fun getFirstFrame(videoPath: String?): Bitmap? {
|
val media = MediaMetadataRetriever()
|
media.setDataSource(videoPath) // videoPath 本地视频的路径
|
val bitmap = media.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
|
val baos = ByteArrayOutputStream()
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
|
return bitmap
|
}
|
|
fun createVideoThumbnail(filePath: String, kind: Int = MediaStore.Images.Thumbnails.MINI_KIND): Bitmap? {
|
var bitmap: Bitmap? = null
|
val retriever = MediaMetadataRetriever()
|
try {
|
if (filePath.startsWith("http://")
|
|| filePath.startsWith("https://")
|
|| filePath.startsWith("widevine://")
|
) {
|
retriever.setDataSource(filePath, Hashtable<String, String>())
|
} else {
|
retriever.setDataSource(filePath)
|
}
|
bitmap = retriever.getFrameAtTime(
|
0,
|
MediaMetadataRetriever.OPTION_CLOSEST_SYNC
|
) //retriever.getFrameAtTime(-1);
|
} catch (ex: IllegalArgumentException) {
|
// Assume this is a corrupt video file
|
ex.printStackTrace()
|
} catch (ex: RuntimeException) {
|
// Assume this is a corrupt video file.
|
ex.printStackTrace()
|
} finally {
|
try {
|
retriever.release()
|
} catch (ex: RuntimeException) {
|
// Ignore failures while cleaning up.
|
ex.printStackTrace()
|
}
|
}
|
if (bitmap == null) {
|
return null
|
}
|
if (kind == MediaStore.Images.Thumbnails.MINI_KIND) { //压缩图片 开始处
|
// Scale down the bitmap if it's too large.
|
val width = bitmap.width
|
val height = bitmap.height
|
val max = Math.max(width, height)
|
if (max > 512) {
|
val scale = 512f / max
|
val w = Math.round(scale * width)
|
val h = Math.round(scale * height)
|
bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true)
|
} //压缩图片 结束处
|
} else if (kind == MediaStore.Images.Thumbnails.MICRO_KIND) {
|
bitmap = ThumbnailUtils.extractThumbnail(
|
bitmap,
|
96,
|
96,
|
ThumbnailUtils.OPTIONS_RECYCLE_INPUT
|
)
|
}
|
return bitmap
|
}
|
}
|