android 截屏保存并返回字节流的封装

105 阅读1分钟

最近有个需求,要求截屏上传,所以给封装了一个工具类,可以截屏,保存截屏并压缩写文件,返回压缩后文件的字节流,相信会比较实用

package com.purui.common.utils

import android.graphics.Bitmap
import android.view.View
import com.lujianfei.netlog.NetLog
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream

object ScreenShotHelper {

    /**
     * 屏幕截取
     */
    fun take(view:View):Bitmap {
        view.isDrawingCacheEnabled = true
        view.buildDrawingCache(true)
        val bitmap = Bitmap.createBitmap(view.drawingCache)
        view.isDrawingCacheEnabled = false
        return bitmap
    }

    /**
     * 保存位图并返回压缩后写 jpg 文件的字节流
     */
    fun saveBitmap(file: File, bitmap: Bitmap, callback:(bytes:ByteArray)->Unit) {
        val outputStream = FileOutputStream(file)
        kotlin.runCatching {
            // 图片有损压缩至 80%
            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
        }.onFailure {
            NetLog.sendLog("ScreenShotHelper bitmap.compress $it")
        }
        kotlin.runCatching {
            outputStream.close()
        }.onFailure {
            NetLog.sendLog("ScreenShotHelper outputStream.close $it")
        }

        val inputStream = FileInputStream(file)
        val buffer = ByteArray(1024)
        val byteArrayOutputStream = ByteArrayOutputStream()
        while (true) {
            val len = inputStream.read(buffer)
            if (len == -1) {
                break
            }
            byteArrayOutputStream.write(buffer, 0, len)
        }
        callback.invoke(byteArrayOutputStream.toByteArray())
    }
}