运行有问题或需要源码请点赞关注收藏后评论区留言~~~

一、使用摄像机录制视频

与音频类似,通过系统摄像机可以很方便的录制视频,只要指定摄像动作为MediaStore.ACTION_VIDEO_CAPTURE即可

视频录制完成之后,最好能够预览视频的摄制画面,所以代码中调用了getOneFrame方法获取视频文件的某帧图片,查看该图片可以大致了解视频内容

效果如下

因为没连真机所以摄像头拍不出什么 读者可自行连接真机测试效果更佳

代码如下

Java类

package com.example.chapter13;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.chapter13.util.DateUtil;import com.example.chapter13.util.FileUtil;import com.example.chapter13.util.MediaUtil;public class VideoRecordActivity extends AppCompatActivity implements View.OnClickListener {    private final static String TAG = "VideoRecordActivity";    private int RECORDER_CODE = 1; // 录制操作的请求码    private TextView tv_video;    private RelativeLayout rl_video;    private ImageView iv_video;    private Uri mVideoUri; // 视频文件的路径对象    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_video_record);        tv_video = findViewById(R.id.tv_video);        rl_video = findViewById(R.id.rl_video);        iv_video = findViewById(R.id.iv_video);        findViewById(R.id.btn_recorder).setOnClickListener(this);        findViewById(R.id.rl_video).setOnClickListener(this);    }    @Override    public void onClick(View v) {        if (v.getId() == R.id.btn_recorder) {            // 下面准备跳到系统的摄像机,并获得录制完的视频文件            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 视频质量。0 低质量;1 高质量            intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 10485760L); // 大小限制,单位字节            intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10); // 时长限制,单位秒            startActivityForResult(intent, RECORDER_CODE); // 打开系统摄像机        } else if (v.getId() == R.id.rl_video) {            // 创建一个内容获取动作的意图(准备跳到系统播放器)            Intent intent = new Intent(Intent.ACTION_VIEW);            intent.setDataAndType(mVideoUri, "video/*"); // 类型为视频            startActivity(intent); // 打开系统的视频播放器        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {        super.onActivityResult(requestCode, resultCode, intent);        if (resultCode==RESULT_OK && requestCode==RECORDER_CODE){ // 从摄像机返回            mVideoUri = intent.getData(); // 获得已录制视频的路径对象//            // 生成临时视频的保存路径//            String filePath = String.format("%s/%s.mp4",//                    getExternalFilesDir(Environment.DIRECTORY_MOVIES), "video_"+ DateUtil.getNowDateTime());//            // 把录制完的视频保存到临时路径//            FileUtil.saveFileFromUri(this, mVideoUri, filePath);            tv_video.setText("录制完成的视频地址为:"+mVideoUri.toString());            rl_video.setVisibility(View.VISIBLE);            // 获取视频文件的某帧图片            Bitmap bitmap = MediaUtil.getOneFrame(this, mVideoUri);            iv_video.setImageBitmap(bitmap); // 设置图像视图的位图对象        }    }}

XML文件

    

二、从视频库中选取视频

系统自带的相册通常既保存图片又保存视频,这意味着用户能够从中选择已有的视频,此时相册相当于系统视频库,正如App可以跳到系统 相册选择图片那样,App也能跳到系统视频库选择视频,不同之处在于,打开视频库之前需要指定数据类型为视频,这样系统才知道该去浏览视频库了

与图片类似,选择单个视频与多个视频的回调方法是不一样的,此处不再赘述

效果如下

此处可以选择拍摄或选择已有文件

拍摄画面如下 连接真机食用效果更佳~~~

代码如下

Java类

package com.example.chapter13;import android.content.ClipData;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.chapter13.util.MediaUtil;public class VideoChooseActivity extends AppCompatActivity implements View.OnClickListener {    private final static String TAG = "VideoChooseActivity";    private int CHOOSE_CODE = 3; // 只在视频库挑选图片的请求码    private int COMBINE_CODE = 4; // 既可录像获得现场视频、也可在视频库挑选已有视频的请求码    private TextView tv_video;    private RelativeLayout rl_video;    private ImageView iv_video;    private Uri mVideoUri; // 视频文件的路径对象    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_video_choose);        tv_video = findViewById(R.id.tv_video);        rl_video = findViewById(R.id.rl_video);        iv_video = findViewById(R.id.iv_video);        findViewById(R.id.btn_choose).setOnClickListener(this);        findViewById(R.id.btn_combine).setOnClickListener(this);        findViewById(R.id.rl_video).setOnClickListener(this);    }    @Override    public void onClick(View v) {        if (v.getId() == R.id.btn_choose) {            // 创建一个内容获取动作的意图(准备跳到系统视频库)            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 是否允许多选            intent.setType("video/*"); // 类型为视频            startActivityForResult(intent, CHOOSE_CODE); // 打开系统视频库        } else if (v.getId() == R.id.btn_combine) {            openSelectDialog(); // 打开选择对话框(要录像还是去视频库)        } else if (v.getId() == R.id.rl_video) {            // 创建一个内容获取动作的意图(准备跳到系统播放器)            Intent intent = new Intent(Intent.ACTION_VIEW);            intent.setDataAndType(mVideoUri, "video/*"); // 类型为视频            startActivity(intent); // 打开系统的视频播放器        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {        super.onActivityResult(requestCode, resultCode, intent);        if (resultCode==RESULT_OK && requestCode==CHOOSE_CODE) { // 从视频库回来            if (intent.getData() != null) { // 选择一个视频                Uri uri = intent.getData(); // 获得已选择视频的路径对象                showVideoFrame(uri); // 显示视频的某帧图片            } else if (intent.getClipData() != null) { // 选择多个视频                ClipData videos = intent.getClipData(); // 获取剪切板数据                if (videos.getItemCount() > 0) { // 至少选择了一个文件                    Uri uri = videos.getItemAt(0).getUri(); // 取第一个视频                    showVideoFrame(uri); // 显示视频的某帧图片                }            }        }        if (resultCode==RESULT_OK && requestCode==COMBINE_CODE) { // 从混合选择对话框回来            if (intent.getData() != null) { // 录像或者从视频库选择一个视频                Uri uri = intent.getData(); // 获得已选择视频的路径对象                showVideoFrame(uri); // 显示视频的某帧图片            }        }    }    // 打开选择对话框(要录像还是去视频库)    private void openSelectDialog() {        // 声明摄像机的录像行为        Intent recordIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);        Intent[] intentArray = new Intent[] { recordIntent };        // 声明视频库的打开行为        Intent videoIntent = new Intent(Intent.ACTION_GET_CONTENT);        videoIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); // 是否允许多选        videoIntent.setType("video/*"); // 类型为视频        // 弹出含摄像机和视频库在内的列表对话框        Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);        chooserIntent.putExtra(Intent.EXTRA_TITLE, "请录像或选择视频");        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);        chooserIntent.putExtra(Intent.EXTRA_INTENT, videoIntent);        // 在页面底部弹出多种选择方式的列表对话框        startActivityForResult(Intent.createChooser(chooserIntent, "选择视频"), COMBINE_CODE);    }    // 显示视频的某帧图片    private void showVideoFrame(Uri uri) {        mVideoUri = uri;        tv_video.setText("你选中的视频地址为:"+uri.toString());        rl_video.setVisibility(View.VISIBLE);        // 获取视频文件的某帧图片        Bitmap bitmap = MediaUtil.getOneFrame(this, uri);        iv_video.setImageBitmap(bitmap); // 设置图像视图的位图对象    }    }

XML文件

            

创作不易 觉得有帮助请点赞关注收藏~~~