小工具知识网

当前位置: 首页 > 行业知识 > 【Android】录屏功能实现——MediaProjection

行业知识

【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项目源码极速下载攻略

下一篇:服务器接显示器怎么用?