android 11以上 截图工具类
以上方法,需要系统权限才能使用,而且必须集成系统的API才能使用。并非常规应用可以使用的。需要重要区分。例如:负一屏截图等。
工具类
kotlin
package com.ivi.system.utils
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Rect
import android.os.ServiceManager
import android.util.Log
import android.view.Display
import android.view.IWindowManager
import android.view.WindowManager
import android.view.WindowMetrics
import android.window.ScreenCapture
import com.ivi.base.utils.LogUtil
object ScreenShotUtil {
private const val TAG = "ScreenShotUtil"
private const val WIDTH = 1920
private const val HEIGHT = 1080
private var bmp: Bitmap? = null
private var sourceCrop: Rect? = null
private var captureArgs: ScreenCapture.CaptureArgs? = null
private var windowManager: WindowManager? = null
private var iWindowManager: IWindowManager? = null
private var display: Display? = null
private var mContext: Context? = null
fun init(context: Context) {
mContext = context
windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
iWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.WINDOW_SERVICE)
)
val windowMetrics: WindowMetrics? = windowManager?.currentWindowMetrics
display = context.display
var width = windowMetrics?.bounds?.width()
var height = windowMetrics?.bounds?.height()
if (width == null)
width = WIDTH
if (height == null)
height = HEIGHT
sourceCrop = Rect(0, 0, width, height)
captureArgs = ScreenCapture.CaptureArgs.Builder()
.setSourceCrop(sourceCrop)
.build()
}
fun screenshot(): Bitmap? {
LogUtil.i(TAG, "screenshot: ")
try {
Log.d(TAG, "screenshot: start")
val syncScreenCapture =
ScreenCapture.createSyncCaptureListener() as ScreenCapture.SynchronousScreenCaptureListener
display?.displayId?.let {
iWindowManager?.captureDisplay(
it,
captureArgs,
syncScreenCapture
)
}
val buffer: ScreenCapture.ScreenshotHardwareBuffer? = syncScreenCapture.buffer
bmp = buffer?.asBitmap()
Log.d(TAG, "screenshot: end")
return bmp
} catch (e: Exception) {
LogUtil.e(TAG, "screenshot: Exception = $e")
}
return null
}
fun destroy() {
windowManager = null
iWindowManager = null
display = null
}
}
使用方法
kotlin
ScreenShotUtil.init(context)
val bp = ScreenShotUtil.screenshot()