Android小白录屏源码

简介

在Android开发中,录屏功能是很常见的需求。本文将介绍如何使用Android提供的API来实现录屏功能,适合初学者学习和了解Android开发。

录屏实现原理

Android系统提供了MediaProjection类来实现屏幕录制。通过使用MediaProjection和MediaCodec,我们可以将屏幕内容编码为视频文件。

实现步骤

1. 获取屏幕录制权限

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

通过以下代码请求屏幕录制权限:

private static final int REQUEST_CODE_SCREEN_CAPTURE = 1;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Intent intent = ((MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE))
            .createScreenCaptureIntent();
    startActivityForResult(intent, REQUEST_CODE_SCREEN_CAPTURE);
}

onActivityResult方法中获取MediaProjection对象:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_SCREEN_CAPTURE) {
        if (resultCode == Activity.RESULT_OK) {
            MediaProjectionManager mediaProjectionManager = (MediaProjectionManager)
                    getSystemService(Context.MEDIA_PROJECTION_SERVICE);
            MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
            
            // 录制屏幕
            startScreenRecording(mediaProjection);
        }
    }
}

2. 录制屏幕

使用MediaProjection和MediaCodec来录制屏幕。首先创建一个VirtualDisplay对象,然后创建一个MediaCodec编码器,最后启动屏幕录制。

private void startScreenRecording(MediaProjection mediaProjection) {
    // 获取屏幕宽高
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;
    
    // 创建VirtualDisplay对象
    VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("ScreenRecording",
            screenWidth, screenHeight, metrics.densityDpi,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
            mediaProjectionCallback, null, null);

    // 创建MediaCodec编码器
    MediaCodec codec = MediaCodec.createEncoder(MediaFormat.MIMETYPE_VIDEO_AVC, screenWidth, screenHeight, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, screenWidth, screenHeight);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 6000000);
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
    codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    Surface surface = codec.createInputSurface();
    
    // 启动屏幕录制
    codec.start();
}

3. 停止录制

通过调用VirtualDisplay对象的release方法和MediaCodec对象的stoprelease方法停止录制。

private void stopScreenRecording() {
    if (virtualDisplay != null) {
        virtualDisplay.release();
        virtualDisplay = null;
    }

    if (codec != null) {
        codec.stop();
        codec.release();
        codec = null;
    }
}

总结

通过使用Android提供的MediaProjection和MediaCodec类,我们可以实现屏幕录制功能。本文介绍了如何获取屏幕录制权限、录制屏幕和停止录制。希望本文对初学者学习Android开发有所帮助。

pie
    title 录屏用途
    "教育" : 45
    "游戏" : 30
    "娱乐" : 15
    "其他" : 10

以上是关于Android小白录屏源码的介绍,希望对你有所帮助。