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

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

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui