VideoView视频组件

简介

        VideoView 在Android中是一个用户界面组件,它允许开发者在Android设备的屏幕上播放视频文件。它是Android SDK的一部分,位于android.widget包中。VideoView提供了一种简单的方法来嵌入和控制视频播放,包括设置视频源、开始、暂停、 seek(跳转到视频的特定位置)以及显示视频的控件等基本功能。开发人员可以轻松地将VideoView添加到布局文件中,并通过Java或Kotlin代码来控制其行为。VideoView 是Android提供的一个用于显示视频的视图组件,它简化了在应用中播放视频的复杂性。VideoView 能够处理视频文件的加载、解码和显示,同时也支持播放、暂停、停止等基本的播放控制。通过设置视频的路径或URI,VideoView 可以播放本地文件系统、资源文件或网络上的视频。

        MediaController 是一个封装了视频播放控制界面的类,包括播放/暂停按钮、进度条、前进/后退等控制项。它作为一个浮动的UI元素出现,通常在视频播放时从屏幕底部滑入,并在用户触摸屏幕其他地方或按下播放控制后自动隐藏。通过与VideoView 绑定,MediaController 提供了用户直接控制视频播放的功能,而无需开发者手动实现这些控制逻辑。

一、属性 (Attributes):

  1. android:id: 控件的唯一标识符。
  2. android:layout_width: 控件的宽度,如 "match_parent" 或 "wrap_content"。
  3. android:layout_height: 控件的高度,同样可以是 "match_parent" 或 "wrap_content"。
  4. android:src: 直接指定视频资源的URI,可以是本地文件路径或者网络URL。

二、方法 (Methods):

  1. setVideoPath(String path): 设置要播放的视频文件的路径,可以是本地路径。
  2. setVideoURI(Uri uri): 与setVideoPath类似,但接受一个Uri对象,更通用,支持更多来源。
  3. start(): 开始或继续播放视频。
  4. pause(): 暂停视频播放。
  5. stopPlayback(): 停止播放视频并释放资源。
  6. seekTo(int msec): 跳转到视频的指定时间点(以毫秒为单位)。
  7. isPlaying(): 判断视频是否正在播放,返回布尔值。
  8. getDuration(): 获取视频的总时长(毫秒)。
  9. getCurrentPosition(): 获取当前播放位置(毫秒)。
  10. setOnPreparedListener(OnPreparedListener listener): 设置准备完成监听器,当视频准备就绪时被调用。
  11. setOnErrorListener(OnErrorListener listener): 设置错误监听器,当播放发生错误时被调用。
  12. setOnCompletionListener(OnCompletionListener listener): 设置播放完成监听器,当视频播放完毕时被调用。
  13. setOnCompletionListener(OnCompletionListener listener): 设置一个监听器,当视频播放完毕时会被调用。
  14. setOnInfoListener(OnInfoListener listener): 设置一个监听器,接收视频播放过程中的信息事件,如缓冲状态变化。
  15. setAudioStreamType(int streamtype): 设置音频流类型,例如AudioManager.STREAM_MUSIC
  16. requestFocus(): 请求获得焦点,对于开始播放视频可能是必需的。
  17. setZOrderOnTop(boolean onTop): 设置VideoView的绘制层级,如果为true,VideoView将被绘制在最顶层。
  18. setMediaController(MediaController mediaController): 为VideoView绑定一个MediaController实例,提供播放控制界面。

三、网络访问权限

        在AndroidManifest.xml文件中添加 <uses-permission android:name="android.permission.INTERNET"/> 这行代码,是为了授予您的应用程序访问网络的权限。这在网络相关的功能中是必不可少的,比如加载在线图片、播放在线音频或视频、进行HTTP/HTTPS请求等。

        上述权限声明告诉Android系统,您的应用需要互联网连接来执行某些操作。不包含这一权限声明的应用在尝试进行网络操作时,可能会遇到安全异常或无法连接网络的问题。

        确保在应用中涉及网络交互的部分(如您的VideoView播放在线视频的场景)之前,已经在清单文件中声明了这个权限。这样,当用户安装应用时,系统会根据用户的权限管理设置,可能请求用户明确授权网络访问权限。

        

<uses-permission android:name="android.permission.INTERNET"/>

四、VideoView与MediaController

        

  1. 1.构建视频URL:

    Uri uri = Uri.parse("https://vdept3.bdstatic.com/...");

    这里通过Uri.parse()方法构造了一个指向在线视频资源的URI。这个URL包含了视频的详细地址以及一些查询参数,如认证密钥、渠道来源等信息,确保视频播放请求的有效性和安全性。

  2. 2.设置视频源:

    videoView.setVideoURI(uri);

    使用setVideoURI()方法将刚刚构建的视频URI设置给VideoView,指定了待播放的视频资源。

  3. 3.创建MediaController并绑定:

    MediaController mediaController = new MediaController(MainActivity.this);
    videoView.setMediaController(mediaController);
    mediaController.setAnchorView(videoView);
    • MediaController是视频播放控制条,包含了播放/暂停、进度条、时间显示等功能。
    • setMediaController()将MediaController与VideoView绑定,使用户可以通过控制条来控制视频播放。
    • setAnchorView()设置MediaController依附的视图,通常就是VideoView本身,这样控制条会出现在VideoView附近。
  4. 4.视频准备完成的监听:

    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {videoView.start();}
    });

    当VideoView成功加载视频资源并准备就绪后,onPrepared()回调会被触发,这时调用videoView.start()开始播放视频。

  5. 5.视频播放错误的监听:

    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mediaPlayer, int what, int extra) {return true; // 表示已经处理错误}
    });

    如果视频加载或播放过程中发生错误,onError()会被调用。在这个例子中,错误被简单地捕获并返回true,表明错误已被处理。在实际应用中,你可能希望在此处添加更详细的错误处理逻辑,比如显示错误消息给用户。

  6. 6.请求焦点并准备播放:

    videoView.requestFocus();

    调用requestFocus()是为了确保VideoView能够获取到播放视频所需的系统资源。这对于开始视频播放是必要的,特别是在某些设备或Android版本上。

五、最终代码

xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="160dp"android:layout_marginTop="184dp"android:text="获取"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><VideoViewandroid:id="@+id/vide"android:layout_width="match_parent"android:layout_height="200dp"android:layout_marginTop="60dp"app:layout_constraintEnd_toEndOf="@+id/button"app:layout_constraintHorizontal_bias="0.495"app:layout_constraintStart_toStartOf="@+id/button"app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>

代码:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);VideoView videoView = findViewById(R.id.vide);Button button = findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Uri uri = Uri.parse("https://vdept3.bdstatic.com" +"/mda-njqbvdg1h8kdqez1/360p/h264/1666686182379099288/" +"mda-njqbvdg1h8kdqez1.mp4?v_from_s" +"=hkapp-haokan-suzhou&auth_key" +"=1718966886-0-0-30cb29791337dc2901a841ffa9c6a569&bcevod_channel" +"=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid" +"=2886407324&vid=14746953470406117750&klogid=2886407324&abtest=");videoView.setVideoURI(uri);MediaController mediaController = new MediaController(MainActivity.this);videoView.setMediaController(mediaController);//设置控制器依附于VideoViewmediaController.setAnchorView(videoView);//视频加载好后设置监听videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {videoView.start();}});//视频加载错误的监听videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mediaPlayer, int i, int i1) {return true;//表示已经处理错误}});//请求焦点并准备播放videoView.requestFocus();}});}
}

六、最终效果

VideoView视频组件博客最终效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CV每日论文--2024.6.27

1、Text-Animator: Controllable Visual Text Video Generation 中文标题&#xff1a;Text-Animator&#xff1a;可控视觉文本视频生成 简介&#xff1a;视频生成是各行业中具有重要价值但同时也极具挑战性的任务,例如在游戏、电子商务和广告领域。在文本到视频(T2V)生成中,一…

前端Bug 修复手册

1.前端长整数精度丢失问题 &#xff08;1&#xff09;问题 在前后端联调时&#xff0c;发现后端有一个接口返回的值和前端页面上展示的值不一致。 后端Java实现的接口如下&#xff0c;返回一个json格式的大整数 123456789123456789&#xff1a; 但是前端请求这个接口后&…

Spring每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别&#xff1f;Spring Boot的优点Spring IoC是什么&#xff1f;说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值&#xff1f;Spring Boot自动装配原理Spring MVC工作原…

Charles抓包工具系列文章(三)-- 接口映射工具(Map Remote和Map Local)

一、背景 前文的http请求都是静态的&#xff0c;像compose a new request&#xff0c;仅适用于接口的自测。 回放repeat 一个 http 请求&#xff0c;也无法做到动态调试。 这里的动态还是静态&#xff0c;是站在客户端的角度&#xff0c;数据是实时的&#xff0c;可调试的。 …

提升入住率|智慧酒店解决方案,打造有温度的居住体验!

近年来&#xff0c;智慧酒店被越来越多的人关注&#xff0c;由生物识别、物联网技术和互联网技术融合产生的智慧酒店解决方案&#xff0c;不仅可以提升顾客在酒店的入住体验&#xff0c;还可以帮助酒店降低运营成本&#xff0c;这也让越来越的酒店选择了智慧酒店的赛道&#xf…

人工智能--目标检测

欢迎来到 Papicatch的博客 文章目录 &#x1f349;引言 &#x1f349;概述 &#x1f348;目标检测的主要流程通常包括以下几个步骤 &#x1f34d;数据采集 &#x1f34d;数据预处理 &#x1f34d;特征提取 &#x1f34d;目标定位 &#x1f34d;目标分类 &#x1f348;…

文件夹读取难题:详解原因与数据恢复策略

一、文件夹读取不到文件的现象描述 在日常的计算机使用中&#xff0c;有时我们会遇到文件夹读取不到文件的情况。这通常表现为在尝试打开某个文件夹时&#xff0c;其中的文件列表并未正常显示&#xff0c;或者文件虽然显示但无法访问。这种问题不仅影响用户的工作效率&#xf…

通俗易懂的chatgpg的原理简介

目录 一、深度学习与语言模型 二、ChatGPT训练三步走 三、情景学习与思维链 四、修改提示语优化结果 五、能力评估和注意问题 六.算法原理 简介&#xff1a; ChatGPT的人工智能原理主要基于深度学习技术&#xff0c;特别是大规模的预训练语言模型和Transformer结构。Cha…

马斯克宣布xAI将在8月份推出Grok-2大模型 预计年底推出Grok-3

在今年内&#xff0c;由特斯拉创始人马斯克创立的人工智能初创公司xAI将推出两款重要产品Grok-2和Grok-3。马斯克在社交平台上透露了这一消息&#xff0c;其中Grok-2预计在今年8月份面世&#xff0c;而Grok-3则计划于年底前亮相。 除此之外&#xff0c;马斯克还表示&#xff0c…

EI期刊投稿要多久

EI检索的文章&#xff0c;无论是期刊还是会议论文&#xff0c;从投稿到发表的时间长度不一&#xff0c;受到多种因素的影响&#xff0c;包括期刊的审稿速度、会议的安排、以及EI的检索周期。 对于EI期刊文章&#xff0c;整个过程通常需要5到8个月&#xff0c;有时甚至更长。这包…

iptable精讲

SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换&#xff0c;Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名&#xff1a;gw 主机名&#xff1…

嵌入式以太网硬件构成与MAC、PHY芯片功能介绍

一.以太网电路基本构成 1.总体介绍 对于上述三部分&#xff0c;并不一定都是独立的芯片&#xff0c;主要有以下几种情况&#xff1a; CPU内部集成了MAC和PHY&#xff0c;难度较高&#xff1b; CPU内部集成MAC,PHY采用独立芯片(主流方案)&#xff1b; CPU不集成MAC和PHY&#…

招生报名系统教培招生小程序

招生报名系统&#xff1a;轻松实现教培招生新高度 &#x1f680; 招生报名系统&#xff0c;开启智慧教育新时代 在当今数字化快速发展的时代&#xff0c;教育行业也迎来了变革的浪潮。招生报名系统作为这一变革的先锋&#xff0c;为教育机构提供了全新的招生渠道和管理方式。通…

挑战与成长:面对他人成就引发的焦虑与迷茫

挑战与成长&#xff1a;面对他人成就引发的焦虑与迷茫 对于追求知识和技能的人来说&#xff0c;看到他人做出自己尚未达到的成就确实会带来焦虑感。这种焦虑常常源于对自己能力的质疑和对未来的不确定性。 在我的学习和发展过程中&#xff0c;有时确实会看到其他模型或系统能…

实操Nginx+Tomcat多实例部署,实现负载均衡和动静分离

192.168.10.10 192.168.10.20 192.168.10.30 location ~ \.jsp$ {proxy_pass http://192.168.10.50:8080;} location ~ \.(jsp|html)$ {root /usr/share/nginx/html;}192.168.10.40和192.168.10.50用脚本完成搭建此处安装附上脚本&#xff1a; #!/bin/bash# 定义变量 JDK_PACKA…

【微服务网关——Websocket代理】

1.Websocket协议与原理 1.1 连接建立协议 1.1.1 客户端发起连接请求 客户端通过 HTTP 请求发起 WebSocket 连接。以下是一个 WebSocket 握手请求的例子&#xff1a; GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key…

Python面试宝典第3题:石子游戏

题目 Alice 和 Bob 用几堆石子在做游戏&#xff1a;一共有偶数堆石子&#xff0c;排成一行&#xff1b;每堆都有正整数颗石子&#xff0c;数目为 piles[i] 。游戏以谁手中的石子最多来决出胜负&#xff0c;石子的总数是奇数 &#xff0c;所以没有平局。 Alice 和 Bob 轮流进行&…

CV01_相机成像原理与坐标系之间的转换

目录 0.引言&#xff1a;小孔成像->映射表达式 1. 相机自身的运动如何表征&#xff1f;->外参矩阵E 1.1 旋转 1.2 平移 2. 如何投影到“像平面”&#xff1f;->内参矩阵K 2.1 图像平面坐标转换为像素坐标系 3. 三维到二维的维度是如何丢失的&#xff1f;…

LVS-负载均衡

目录 一、概念 二、LVS工作原理 1. ipvs/ipvsadm 2.名词&#xff1a; 三、常用命令 四、工作模式 1.NAT地址转换模式 &#xff08;1&#xff09;工作流程 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;实验过程 a.环境准备&#xff1a; b.修改测试机的…

UE5 动画蓝图

文章目录 一、State Machines二、Blend Spaces三、Aim Offset四、Montage 初步介绍 Unreal Engine 5 Tutorial - Animation Blueprint Part 1: State Machines (youtube.com) Unreal Engine 5 Tutorial - Animation Blueprint Part 2: Blend Spaces (youtube.com) Unreal Engi…