Android Studio新手开发第三十五天

目录

利用系统相机录制视频

利用视频视图与媒体控制条播放视频

利用系统相机录制视频

与使用Camera工具结合MediaRecorder录制视频相比,使用系统相机录制视频在实现上较为简单,但它也有局限性。它的优缺点说明如下:

优点

  1. 开发简单:只需几行代码就可以启动系统相机,无需处理相机初始化、预览、编码等复杂逻辑。

  2. 稳定性高:系统相机经过厂商优化,通常比自定义相机更稳定,兼容性更好。

  3. 功能丰富:系统相机通常提供多种录制模式、滤镜、分辨率选择、变焦、闪光灯控制等功能,用户熟悉操作。

  4. 更新方便:系统相机的更新由手机厂商或Google负责,应用无需更新即可享受新功能。

缺点:

  1. 界面不可定制:无法自定义录制界面,无法与应用的UI风格统一。

  2. 功能受限:只能使用系统相机提供的功能,无法实现一些特定需求(如自定义滤镜、实时特效、自定义编码参数等)。

  3. 体验不一致:不同厂商的系统相机界面和操作方式不同,导致用户在不同设备上体验不一致。

  4. 返回数据限制:在某些设备上,返回的视频可能不是原始质量,或者可能被压缩,而且返回的数据中可能不包含视频的Uri,或者在某些情况下可能返回缩略图而不是文件。

示例代码如下,在布局文件中添加两个按钮以及一个VideoView。

XML 复制代码
<?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">

    <Button
        android:id="@+id/button_Snap_Video"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击拍摄" />

    <Button
        android:id="@+id/button_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始播放视频"/>

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

部分Java代码如下,主要看方法takeVideo以及活动结果启动器中的回调函数的逻辑处理。

java 复制代码
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;
    @Override
    protected 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>() {
            @Override
            public void onActivityResult(Bitmap result) {
                videoView.setVideoURI(mVideoUri);
                hasVideo = true;
                Log.d(TAG, "onActivityResult: " + mVideoUri.toString());
            }
        });


        button_Snap_Video.setOnClickListener(this);
        button_start.setOnClickListener(this);
    }

    @Override
    public 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添加一些代码,如下所示:

java 复制代码
MediaController mediaController = new MediaController(this);
mediaController.setMediaPlayer(videoView);
videoView.setMediaController(mediaController);

效果图如下,拍摄完视频后返回页面,点击视频视图区域会出现媒体控制条,如下图所示,它可以控制视频的启停以及快进快退,还会显示视频长度以及播放进度,点击进度条还可以跳转至对应位置。

相关推荐
qq_717410014 小时前
FAQ20472:相机录像镜像功能实现
android
为什么要做囚徒5 小时前
IntelliJ IDEA 远程断点调试完全指南
java·ide·intellij-idea
非专业程序员Ping6 小时前
HarfBuzz 实战:五大核心API 实例详解【附iOS/Swift实战示例】
android·ios·swift
流星魂小七6 小时前
颜色选择器
android·着色器·环形颜色选择器·圆形颜色选择器·colorpicker·colorwheelview
cdming7 小时前
LIUNX 与手机安卓的文件互传 的常用方法
android·智能手机
数据饕餮8 小时前
faster-whisper热词详解与程序设计
ide·macos·xcode
歪歪1008 小时前
在C#中除了按属性排序,集合可视化器还有哪些辅助筛选的方法?
开发语言·前端·ide·c#·visual studio
雨白8 小时前
Flow 的异常处理与执行控制
android·kotlin
00后程序员张9 小时前
Web 前端工具全流程指南 从开发到调试的完整生态体系
android·前端·ios·小程序·uni-app·iphone·webview