【Android】录屏功能实现——MediaProjection




*   判断服务是否连接成功

*   成功则向系统发送录屏请求



//连接服务成功与否,具体连接过程

//调用连接接口,实现连接,回调连接结果

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
  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android录屏功能实现需要通过使用MediaProjection API来实现。首先,我们需要获取屏幕的图像数据,可以通过MediaProjectionManager类的getMediaProjection()方法来获取用户授权的MediaProjection对象。然后,我们可以使用MediaProjection对象创建VirtualDisplay对象,该对象将屏幕图像数据渲染到一个Surface上。 在创建VirtualDisplay对象时,我们还需要指定渲染图像数据的Surface的参数,比如图像的宽高、dpi等。接下来,我们需要创建一个MediaCodec对象用于对图像数据进行编码,可以选择使用H.264或H.265编码格式。编码过程中,可以选择设置视频的码率、帧率等参数。 在编码完图像数据后,我们可以将编码后的数据保存为一个视频文件。可以使用MediaMuxer类创建一个包含音频轨道和视频轨道的mp4文件。我们需要使用MediaMuxer的addTrack()方法给音频轨道和视频轨道添加数据。编码后的图像数据可以通过MediaCodec的getOutputBuffer()方法获取到,然后写入视频轨道。音频数据可以通过AudioRecord对象获取到,然后写入音频轨道。 最后,我们要记得释放资源。需要调用VirtualDisplay、MediaCodec、MediaMuxer等对象的release()方法释放资源。此外,我们还需要关闭MediaProjection对象。为了保证录屏正常结束,我们可以监听用户按下Home键或其他影响屏幕显示的操作,然后停止录屏并保存视频文件。 总结来说,实现Android录屏功能需要通过获取图像数据、编码、写入文件等步骤来完成。使用MediaProjection API可以方便地获取屏幕图像数据,而MediaCodec和MediaMuxer类可以帮助我们对图像数据进行编码和保存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值