这里写自定义目录标题
systemui的做法
frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ImageCaptureImpl.kt
package com.android.systemui.screenshot
import android.app.IActivityTaskManager
import android.graphics.Bitmap
import android.graphics.Rect
import android.view.IWindowManager
import android.window.ScreenCapture
import android.window.ScreenCapture.CaptureArgs
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
private const val TAG = "ImageCaptureImpl"
@SysUISingleton
open class ImageCaptureImpl @Inject constructor(
private val windowManager: IWindowManager,
private val atmService: IActivityTaskManager,
@Background private val bgContext: CoroutineDispatcher
) : ImageCapture {
override fun captureDisplay(displayId: Int, crop: Rect?): Bitmap? {
val captureArgs = CaptureArgs.Builder()
.setSourceCrop(crop)
.build()
val syncScreenCapture = ScreenCapture.createSyncCaptureListener()
windowManager.captureDisplay(displayId, captureArgs, syncScreenCapture)
val buffer = syncScreenCapture.getBuffer()
return buffer?.asBitmap()
}
override suspend fun captureTask(taskId: Int): Bitmap? {
val snapshot = withContext(bgContext) {
atmService.takeTaskSnapshot(taskId, false /* updateCache */)
} ?: return null
return Bitmap.wrapHardwareBuffer(snapshot.hardwareBuffer, snapshot.colorSpace)
}
}
displayId 是 framework 逻辑 ID(0、1、2…)。
不需要 root,但调用者必须是 system/privileged 进程,且持有 CAPTURE_DISPLAY 权限。
命令行写法
screencap -p /data/data/aaa.png
MediaProjection写法
网上demo多,不赘述