Android 11录制视频保存到相册

近年来,随着智能手机的不断普及,人们对于录制和分享视频的需求也越来越高。作为一个开发者,我们可以利用Android平台提供的功能来实现视频录制和保存到相册的功能。本文将介绍如何在Android 11上实现将录制的视频保存到相册的方法,并提供相关的代码示例。

目录

1. Android 11相册访问权限

在Android 11中,访问相册的方式与之前的版本有所不同。我们需要在AndroidManifest.xml文件中添加以下权限声明:

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

此外,在Android 11中,我们还需要在运行时动态请求相册访问权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
        Uri uri = Uri.parse("package:" + getPackageName());
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri);
        startActivityForResult(intent, PERMISSION_REQUEST_CODE);
    }
}

2. 录制视频

要录制视频,我们可以使用Android的MediaRecorder类。以下是一个简单的示例代码,演示了如何录制视频:

private MediaRecorder mediaRecorder;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;

private void startRecording() {
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

    File outputFile = new File(Environment.getExternalStorageDirectory(), "video.mp4");
    mediaRecorder.setOutputFile(outputFile.getAbsolutePath());

    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.setFixedSize(640, 480);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

    try {
        mediaRecorder.prepare();
        mediaRecorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void stopRecording() {
    mediaRecorder.stop();
    mediaRecorder.release();
    mediaRecorder = null;
}

在上面的代码中,我们首先创建一个MediaRecorder对象,然后设置音频和视频源、输出格式、编码器等。接下来,我们指定输出文件的路径,并设置预览显示的SurfaceHolder。最后,我们调用prepare()方法准备录制,并调用start()方法开始录制。停止录制时,我们调用stop()方法停止录制,并释放MediaRecorder对象。

3. 保存视频到相册

在Android 11中,我们可以使用ContentValuesMediaStore类来保存视频到相册。以下是一个示例代码,演示了如何保存视频到相册:

private void saveVideoToGallery(File videoFile) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
    values.put(MediaStore.Video.Media.DATA, videoFile.getAbsolutePath());

    ContentResolver resolver = getContentResolver();
    resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
}

在上面的代码中,我们首先创建一个ContentValues对象,并设置视频的MIME类型、创建时间和路径。然后,我们获取ContentResolver对象,并通过insert()方法将视频信息插入到相册中。

4. 完整代码示例

下面是一个完整的示例代码,演示了如何录制视频并保存到相册:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    private MediaRecorder mediaRecorder;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;

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

        surfaceView = findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback