Android 保存视频文件到指定目录

在Android应用开发中,我们经常需要保存用户拍摄的视频或者从其他来源获取的视频文件到指定的目录中。本文将介绍如何通过编程的方式实现将视频文件保存到指定目录的功能,并提供相应的代码示例。

1. 确定保存路径

首先,我们需要确定视频文件的保存路径。在Android中,我们可以使用Environment.getExternalStoragePublicDirectory()方法获取公共存储目录,例如保存到相册的路径可以使用:

File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

如果需要保存到应用的私有目录,可以使用Context.getExternalFilesDir()方法获取应用的私有文件目录,例如保存到应用私有目录的路径可以使用:

File storageDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES);

2. 创建保存文件

接下来,我们需要创建保存视频的文件。可以使用File类来创建文件对象,并使用createNewFile()方法创建实际的文件。

String fileName = "video.mp4";
File videoFile = new File(storageDir, fileName);

try {
    boolean success = videoFile.createNewFile();
    if (!success) {
        // 文件创建失败的处理逻辑
    }
} catch (IOException e) {
    e.printStackTrace();
}

3. 获取视频源

在保存视频之前,我们需要先获取要保存的视频源。视频源可以是从相机拍摄的视频,也可以是从网络或其他应用中获取的视频。根据具体的需求,我们可以使用相应的API来获取视频源。

4. 保存视频

一旦我们获取到了视频源,我们就可以将其保存到之前创建的文件中。可以使用输入输出流来实现视频的保存。

InputStream inputStream = ...; // 获取视频源的输入流
OutputStream outputStream = null;

try {
    outputStream = new FileOutputStream(videoFile);

    byte[] buffer = new byte[4096];
    int length;
    while ((length = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }

    outputStream.flush();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (outputStream != null) {
            outputStream.close();
        }
        if (inputStream != null) {
            inputStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

5. 更新媒体库

为了确保保存的视频能够在系统相册或其他媒体应用中被发现,我们需要更新媒体库。可以使用MediaScannerConnection类来实现媒体库的更新。

MediaScannerConnection.scanFile(context, new String[]{videoFile.getAbsolutePath()}, null, new MediaScannerConnection.OnScanCompletedListener() {
    @Override
    public void onScanCompleted(String path, Uri uri) {
        // 媒体库更新完成的处理逻辑
    }
});

完整代码示例

下面是一个完整的代码示例,演示了如何保存视频文件到指定目录。

import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class VideoUtils {

    public static void saveVideo(Context context, InputStream inputStream) {
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        String fileName = "video.mp4";
        File videoFile = new File(storageDir, fileName);

        try {
            boolean success = videoFile.createNewFile();
            if (!success) {
                // 文件创建失败的处理逻辑
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        OutputStream outputStream = null;

        try {
            outputStream = new FileOutputStream(videoFile);

            byte[] buffer = new byte[4096];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }

            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        MediaScannerConnection.scanFile(context, new String[]{videoFile.getAbsolutePath()}, null, new MediaScannerConnection.OnScanCompletedListener() {
            @Override
            public void onScanCompleted(String path, Uri uri) {
                // 媒体库更新完成的处理逻辑
            }