行业知识
【Android】录屏功能实现——MediaProjection
2026-11-05 12:55:52
来源:互联网转载
* 判断服务是否连接成功* 成功则向系统发送录屏请求
//连接服务成功与否,具体连接过程
//调用连接接口,实现连接,回调连接结果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
上一篇:GitHub项目源码极速下载攻略
下一篇:服务器接显示器怎么用?