Android Studio新手开发第三十五天
目录
利用系统相机录制视频
利用视频视图与媒体控制条播放视频
利用系统相机录制视频
与使用Camera工具结合MediaRecorder录制视频相比,使用系统相机录制视频在实现上较为简单,但它也有局限性。它的优缺点说明如下:
优点:
-  开发简单:只需几行代码就可以启动系统相机,无需处理相机初始化、预览、编码等复杂逻辑。 
-  稳定性高:系统相机经过厂商优化,通常比自定义相机更稳定,兼容性更好。 
-  功能丰富:系统相机通常提供多种录制模式、滤镜、分辨率选择、变焦、闪光灯控制等功能,用户熟悉操作。 
-  更新方便:系统相机的更新由手机厂商或Google负责,应用无需更新即可享受新功能。 
缺点:
-  界面不可定制:无法自定义录制界面,无法与应用的UI风格统一。 
-  功能受限:只能使用系统相机提供的功能,无法实现一些特定需求(如自定义滤镜、实时特效、自定义编码参数等)。 
-  体验不一致:不同厂商的系统相机界面和操作方式不同,导致用户在不同设备上体验不一致。 
-  返回数据限制:在某些设备上,返回的视频可能不是原始质量,或者可能被压缩,而且返回的数据中可能不包含视频的Uri,或者在某些情况下可能返回缩略图而不是文件。 
示例代码如下,在布局文件中添加两个按钮以及一个VideoView。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MultiMedia.CameraSnapVideoActivity"><Buttonandroid:id="@+id/button_Snap_Video"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击拍摄" /><Buttonandroid:id="@+id/button_start"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="开始播放视频"/><VideoViewandroid:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>部分Java代码如下,主要看方法takeVideo以及活动结果启动器中的回调函数的逻辑处理。
public class CameraSnapVideoActivity extends AppCompatActivity implements View.OnClickListener {private final String TAG = "CameraSnapVideo";private Button button_Snap_Video, button_start;private VideoView videoView;private ActivityResultLauncher activityResultLauncher_video_bitmap;private Uri mVideoUri;private boolean hasVideo = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera_snap_video);initView();}private void initView() {button_Snap_Video = findViewById(R.id.button_Snap_Video);button_start = findViewById(R.id.button_start);videoView = findViewById(R.id.videoView);activityResultLauncher_video_bitmap = registerForActivityResult(new ActivityResultContracts.TakeVideo(), new ActivityResultCallback<Bitmap>() {@Overridepublic void onActivityResult(Bitmap result) {videoView.setVideoURI(mVideoUri);hasVideo = true;Log.d(TAG, "onActivityResult: " + mVideoUri.toString());}});button_Snap_Video.setOnClickListener(this);button_start.setOnClickListener(this);}@Overridepublic void onClick(View view) {if (view.getId() == R.id.button_Snap_Video){Log.d(TAG, "initView: ");takeVideo();}else if (view.getId() == R.id.button_start){if (!videoView.isPlaying() && hasVideo){videoView.start();}}}private void takeVideo() {// Android10开始必须由系统自动分配路径,同时该方式也能自动刷新相册ContentValues values = new ContentValues();Calendar calendar = Calendar.getInstance();String time = String.format("%s%s%s%s", calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));// 指定图片文件的名称values.put(MediaStore.Video.Media.DISPLAY_NAME, "video_" + time);values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); // 类型为视频// 通过内容解析器插入一条外部内容的路径信息mVideoUri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);activityResultLauncher_video_bitmap.launch(mVideoUri);}
}效果图如下,点击按钮后拍摄完视频,回来后点击播放可以看到刚刚录制的视频。视频保存在系统相册中,可以在系统相册中查看刚刚拍摄的视频。

利用视频视图与媒体控制条播放视频
在上面用到了一个视图VideoView视频视图,这个视图是Android提供的视频播放控件,它可以用于播放视频以及控制视频的播放。视频视图VideoView的常用方法说明如下:
1.setVideoURI:设置视频文件的URI路径。
2.setVideoPath:设置视频文件的字符串路径。
3.setMediaController:设置媒体控制条的对象。
4.start:开始播放视频。
5.pause:暂停播放视频。
6.resume:恢复播放视频。
7.suspend:结束播放并释放资源。
8.getDuration:获取视频的总时长,单位为毫秒ms。
9.getCurrentPosition:获取当前的播放位置。若返回值为视频总长即视频播放至末尾。
10.isPlaying:判断视频是否在播放。
在使用上面的示例代码是可以发现点击VideoView视频视图是没有任何反应的,因为它是显示播放界面而没有控制按钮以及进度条。它需要配合媒体控制条MediaController来实现基本的控制动作,如开始、暂停播放以及进度条等。
MediaController媒体控制条的常用方法说明如下:
1.setMediaPlayer:设置媒体播放器的对象,也就是指定要控制哪个VideoView。
2.show:显示媒体控制条。
3.hide:隐藏媒体控制条。
4.isShowing:判断媒体控制条是否在显示。
示例代码如下,媒体控制条MediaController无需再布局文件中添加,只需要添加视频视图VideoView即可,关于媒体控制条的设置只需在Java代码中设置即可。布局文件与上面的示例代码一致即可。Java代码与上面的示例代码类似,需要再方法initView添加一些代码,如下所示:
MediaController mediaController = new MediaController(this);
mediaController.setMediaPlayer(videoView);
videoView.setMediaController(mediaController);效果图如下,拍摄完视频后返回页面,点击视频视图区域会出现媒体控制条,如下图所示,它可以控制视频的启停以及快进快退,还会显示视频长度以及播放进度,点击进度条还可以跳转至对应位置。

