Android Studio 录屏

在开发Android应用程序时,我们经常需要记录和分享我们的应用的演示或教程。Android Studio提供了一个内置的录屏工具,可以轻松地录制设备屏幕,并导出为高质量的视频文件。本文将介绍如何使用Android Studio的录屏功能以及一些示例代码。

准备工作

在使用Android Studio录屏功能之前,我们需要确保以下准备工作已完成:

  1. 安装Android Studio:从官方网站下载并安装最新版本的Android Studio。
  2. 连接设备:使用USB数据线将Android设备连接到计算机,并确保已启用开发者选项和USB调试。

录制屏幕

  1. 打开Android Studio并创建一个新的Android项目。
  2. 点击工具栏上的“AVD Manager”图标,启动Android模拟器。
  3. 在模拟器中运行你的应用程序,或者通过USB调试运行应用程序在实际设备上。
  4. 在Android Studio中,点击工具栏上的“Device File Explorer”图标以打开设备文件浏览器。
  5. 在设备文件浏览器中,导航到/data/local/tmp目录。
  6. 右键单击空白处,选择“Start Recording Screen”选项以开始录制屏幕。
  7. 录制期间,你可以在右上角的工具栏上查看录制的时间。
  8. 当你完成屏幕录制后,点击工具栏上的“Stop Recording Screen”按钮。
  9. 选择一个位置保存录制的视频文件。

示例代码

下面是一个简单的示例代码,演示如何在Android中使用MediaProjectionManager类开始和停止录制屏幕:

import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Surface;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_SCREEN_CAPTURE = 1;

    private MediaProjectionManager mediaProjectionManager;
    private MediaProjection mediaProjection;
    private VirtualDisplay virtualDisplay;
    private MediaRecorder mediaRecorder;

    private Button startButton;
    private boolean isRecording = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mediaRecorder = new MediaRecorder();

        startButton = findViewById(R.id.start_button);
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRecording) {
                    stopRecording();
                } else {
                    startRecording();
                }
            }
        });
    }

    private void startRecording() {
        Intent screenCaptureIntent = mediaProjectionManager.createScreenCaptureIntent();
        startActivityForResult(screenCaptureIntent, REQUEST_CODE_SCREEN_CAPTURE);
    }

    private void stopRecording() {
        mediaRecorder.stop();
        mediaRecorder.reset();
        virtualDisplay.release();
        mediaProjection.stop();

        startButton.setText("Start Recording");
        isRecording = false;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_SCREEN_CAPTURE && resultCode == RESULT_OK) {
            mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
            Surface surface = mediaRecorder.getSurface();
            virtualDisplay = mediaProjection.createVirtualDisplay("ScreenCapture",
                    getResources().getDisplayMetrics().widthPixels,
                    getResources().getDisplayMetrics().heightPixels,
                    getResources().getDisplayMetrics().densityDpi,
                    DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                    surface, null, null);

            try {
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
                String fileName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
                        + "/ScreenCapture_" + timeStamp + ".mp4";
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                mediaRecorder.setVideoEncodingBitRate(512 * 1000);
                mediaRecorder.setVideoFrameRate(30);
                mediaRecorder.setVideoSize(getResources().getDisplayMetrics().widthPixels,
                        getResources().getDisplayMetrics().heightPixels);
                mediaRecorder.setOutputFile