下面给一段 kotlin 的例子,相信大家能秒懂并直接运用到项目中
XXActivity 下加入以下代码,需要时调用 requestScreenRecorder 方法
companion object {
const val REQUEST_SCREEN_RECORDER = 100
}
private var mMediaProjectionManager:MediaProjectionManager ?= null
/**
* 申请权限
*/
private fun requestScreenRecorder() {
mMediaProjectionManager =
getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
startActivityForResult(
mMediaProjectionManager?.createScreenCaptureIntent(),
REQUEST_SCREEN_RECORDER
)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
REQUEST_SCREEN_RECORDER -> {
data?.let {
val mediaProjection =
mMediaProjectionManager?.getMediaProjection(resultCode, data) ?: return
val file = File(dataDir,"recorder.mp4") //录屏生成文件
mMediaRecordService = MediaRecordService(
1024, 600, 6000000, 1,
mediaProjection, file.absolutePath
)
mMediaRecordService?.start()
}
}
}
}
依赖的核心类 MediaRecordService
package com.bdxh.clientstudentandroid.service
import android.hardware.display.DisplayManager
import android.hardware.display.VirtualDisplay
import android.media.MediaRecorder
import android.media.projection.MediaProjection
import com.bdxh.clientstudentandroid.utils.LogUtils
/**
* 媒体录制服务
*/
class MediaRecordService (
private val width: Int,
private val height: Int,
private val bitrate: Int,
private val dpi: Int,
private val mediaProjection: MediaProjection?,
private val destPath: String
): Thread() {
companion object {
const val FRAME_RATE = 60
const val TAG = "MediaRecordService"
}
private var mMediaRecorder: MediaRecorder ?= null
private var mVirtualDisplay: VirtualDisplay ?= null
override fun run() {
super.run()
initMediaRecorder()
mVirtualDisplay = mediaProjection?.createVirtualDisplay(
TAG,
width,
height,
dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
mMediaRecorder?.surface,
null,
null
)
mMediaRecorder?.start()
}
/**
* 初始化MediaRecorder
*
* @return
*/
private fun initMediaRecorder() {
mMediaRecorder = MediaRecorder()
mMediaRecorder?.apply {
setVideoSource(MediaRecorder.VideoSource.SURFACE)
// setAudioSource(MediaRecorder.AudioSource.MIC) // 需要 Audio 权限,我们暂时不需要录音,只录屏
setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
setOutputFile(destPath)
setVideoSize(width, height)
setVideoFrameRate(FRAME_RATE)
setVideoEncodingBitRate(bitrate)
setVideoEncoder(MediaRecorder.VideoEncoder.H264)
// setAudioEncoder(MediaRecorder.AudioEncoder.AAC) // 需要 Audio 权限,我们暂时不需要录音,只录屏
try {
mMediaRecorder?.prepare()
} catch (e: Exception) {
e.printStackTrace()
}
LogUtils.i(TAG, "media recorder $bitrate kps")
}
}
fun release() {
if (mVirtualDisplay != null) {
mVirtualDisplay?.release()
mVirtualDisplay = null
}
if (mMediaRecorder != null) {
mMediaRecorder?.setOnErrorListener(null)
mediaProjection?.stop()
mMediaRecorder?.reset()
mMediaRecorder?.release()
}
mediaProjection?.stop()
LogUtils.i(TAG, "release")
}
}