* 判断服务是否连接成功
* 成功则向系统发送录屏请求
//连接服务成功与否,具体连接过程
//调用连接接口,实现连接,回调连接结果
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//服务连接成功,需要通过Binder获取服务,达到Activity和Service通信的目的
//获取Binder
ScreenRecordService.ScreenRecordBinder binder = (ScreenRecordService.ScreenRecordBinder) iBinder;
//通过Binder获取Service
screenRecordService = binder.getScreenRecordService();
//获取到服务,初始化录屏管理者
mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
//通过管理者,创建录屏请求,通过Intent
Intent captureIntent = mediaProjectionManager.createScreenCaptureIntent();
//将请求码作为标识一起发送,调用该接口,需有返回方法
startActivityForResult(captureIntent,REQUEST_CODE);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//连接失败
Toast.makeText(MainActivity.this,"录屏服务未连接成功,请重试!",Toast.LENGTH_SHORT).show();
}
};
* 请求之后,获得返回的信息
@Override
//返回方法,获取返回的信息
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//首先判断请求码是否一致,结果是否ok
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK){
//录屏请求成功,使用工具MediaProjection录屏
//从发送获得的数据和结果中获取该工具
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode,data);
//将该工具给Service,并一起传过去需要录制的屏幕范围的参数
if(screenRecordService != null){
screenRecordService.setMediaProjection(mediaProjection);
screenRecordService.setConfig(metrics.widthPixels,metrics.heightPixels,metrics.densityDpi);
}
}
}
### []( )开始录制
* 获得了返回的信息,将参数都发送过去后,开始录制
//服务的两个主要逻辑
//开始录屏
public boolean startRecord() {
//首先判断是否有录屏工具以及是否在录屏
if (mediaProjection == null || running) {
return false;
}
//有录屏工具,没有在录屏,就进行录屏
//初始化录像机,录音机Recorder
initRecorder();
//根据获取的屏幕参数创建虚拟的录屏屏幕
createVirtualDisplay();
//本来不加异常也可以,但是这样就不知道是否start成功
//万一start没有成功,但是running置为true了,就产生了错误也无提示
//提示开始录屏了,但是并没有工作
try{
//准备工作都完成了,可以开始录屏了
mediaRecorder.start();
//标志位改为正在录屏
running = true;
return true;
}catch (Exception e){
e.printStackTrace();
//有异常,start出错,没有开始录屏,弹出提示
Toast.makeText(this,"开启失败,没有开始录屏",Toast.LENGTH_SHORT).show();
//标志位变回没有录屏的状态
running = false;
return false;
}
}
* 录制需要录像机
//初始化Recorder录像机
public void initRecorder() {
//新建Recorder
mediaRecorder = new MediaRecorder();
//设置录像机的一系列参数
//设置音频来源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置视频来源
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//设置视频格式为mp4
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置视频存储地址,返回的文件夹下的命名为当前系统事件的文件
videoPath = getSaveDirectory() + System.currentTimeMillis() + ".mp4";
//保存在该位置
mediaRecorder.setOutputFile(videoPath);
//设置视频大小,清晰度
mediaRecorder.setVideoSize(width, height);
//设置视频编码为H.264
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置音频编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置视频码率
mediaRecorder.setVideoEncodingBitRate(2 * 1920 * 1080);
mediaRecorder.setVideoFrameRate(18);
//初始化完成,进入准备阶段,准备被使用
//截获异常,处理
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
//异常提示
Toast.makeText(this,
"Recorder录像机prepare失败,无法使用,请重新初始化!",
Toast.LENGTH_SHORT).show();
}
}
* 录制需要虚拟屏幕
public void createVirtualDisplay() {
//虚拟屏幕通过MediaProjection获取,传入一系列传过来的参数
//可能创建时会出错,捕获异常
try {
virtualDisplay = mediaProjection.createVirtualDisplay("VirtualScreen", width, height, dpi