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);

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

相关推荐
selt7914 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao5 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost6 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城6 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下6 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
HarrySunCn6 小时前
如何使用VSCode开发Arduino项目
ide·vscode·单片机·编辑器
maycho1238 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此8 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao9 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34169 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android