前言:网上关于录屏的介绍已经很多了,本篇文章也不过多介绍详细,主要是阐述其流程原理,输出demo,该demo样式仿照小米自带的系统录屏
1.如何录屏
Android中在5.0以上的版本中系统已经提供了屏幕获取的相关类。整个录屏的实现主要涉及到下面4个类
MediaProjectionManager 主要提供捕获屏幕的Intent()
和MediaProjection
MediaProjection 获取媒体投影
MediaRecorder 录制视频
VirtualDisplay 这个理解起来有点抽象,可以理解成一个虚拟的屏幕窗口主要
用来获取屏幕的投影
录制流程也很简单,系统已经为我们提供相关的api,我们只需要处理录制参数和最后的录制文件就行
2.代码
为了在应用中录制方便,将录制封装程了一个工具类,我们使用只需要在录制屏幕所承载的activity中使用就行了
class MainActivity : AppCompatActivity(), ScreenStateListener {
private var screenRecorderBuild: ScreenRecorderBuild? = null
@RequiresApi(Build.VERSION_CODES.M)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//这里需要申请权限
rxPermissions.request(
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.ACCESS_NOTIFICATION_POLICY
).subscribe {
/**
*可以直接 screenRecorderBuild = *ScreenRecorderBuild.Builder()
.setActivity(this)
.build()
**/
screenRecorderBuild = ScreenRecorderBuild.Builder()
.setActivity(this)
.setFps(Utils.getFps())
.setBitRate(Utils.getBitRate())
.setStateListener(this)
.build()
Log.i("ddddd", "dddddd")
}
}
@SuppressLint("NewApi")
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
data?.let {
Log.e("MainActivity","onActivityResult")
screenRecorderBuild?.onActivityResult(requestCode, resultCode, data)
}
}
然后调用
startRecord() //开始录制
stopRecord()//停止录制
resume()//继续录制
pause()//暂停录制
录制状态监听实现
ScreenStateListener
就行
public interface ScreenStateListener {
/**
* 录制中
*/
void recording();
/**
* 暂停中
*/
void pause();
/**
* 录制结束
* @param path 文件地址
*/
void stop(String path);
/**
* 异常
* @param msg 异常提示
*/
void error(String msg);
}
相关设置
screenRecorderBuild = ScreenRecorderBuild.Builder()
.setActivity(this)
.setFps(Utils.getFps())//设置fps 默认24fps
.setBitRate(Utils.getBitRate())//设置视频编码比特率1Mbps、5Mbps。//默认5Mbps
.setStateListener(this) //设置录制监听
.setWidth(1080)//宽 默认系统
.setHeight(1980)//高 默认系统
.setIsAudioVoice(true)//true有声 false无声
.build()
3.注意
有几点需要注意!如果是通过悬浮窗控制录制的,并且在录制结束之后要继续开始录制那么
ScreenRecorderBuild
要放在1像素的承载activity,在接受到
onActivityResult
回调时在退出到后台!否者处于后台状态下的activity是无法收到onActivityResult回调
二是录制过程录制的是整个屏幕上所承载的界面,也就是说悬浮窗也要被录制,系统自带的不录制悬浮窗是在framework层修改代码了的
最后
demo
apk体验

代码基于ScreenRecordHelper封装
如果觉得可以点个star吧