简介
VideoView 在Android中是一个用户界面组件,它允许开发者在Android设备的屏幕上播放视频文件。它是Android SDK的一部分,位于android.widget包中。VideoView提供了一种简单的方法来嵌入和控制视频播放,包括设置视频源、开始、暂停、 seek(跳转到视频的特定位置)以及显示视频的控件等基本功能。开发人员可以轻松地将VideoView添加到布局文件中,并通过Java或Kotlin代码来控制其行为。VideoView
是Android提供的一个用于显示视频的视图组件,它简化了在应用中播放视频的复杂性。VideoView
能够处理视频文件的加载、解码和显示,同时也支持播放、暂停、停止等基本的播放控制。通过设置视频的路径或URI,VideoView
可以播放本地文件系统、资源文件或网络上的视频。
MediaController
是一个封装了视频播放控制界面的类,包括播放/暂停按钮、进度条、前进/后退等控制项。它作为一个浮动的UI元素出现,通常在视频播放时从屏幕底部滑入,并在用户触摸屏幕其他地方或按下播放控制后自动隐藏。通过与VideoView
绑定,MediaController
提供了用户直接控制视频播放的功能,而无需开发者手动实现这些控制逻辑。
一、属性 (Attributes):
- android:id: 控件的唯一标识符。
- android:layout_width: 控件的宽度,如 "match_parent" 或 "wrap_content"。
- android:layout_height: 控件的高度,同样可以是 "match_parent" 或 "wrap_content"。
- android:src: 直接指定视频资源的URI,可以是本地文件路径或者网络URL。
二、方法 (Methods):
- setVideoPath(String path): 设置要播放的视频文件的路径,可以是本地路径。
- setVideoURI(Uri uri): 与
setVideoPath
类似,但接受一个Uri对象,更通用,支持更多来源。 - start(): 开始或继续播放视频。
- pause(): 暂停视频播放。
- stopPlayback(): 停止播放视频并释放资源。
- seekTo(int msec): 跳转到视频的指定时间点(以毫秒为单位)。
- isPlaying(): 判断视频是否正在播放,返回布尔值。
- getDuration(): 获取视频的总时长(毫秒)。
- getCurrentPosition(): 获取当前播放位置(毫秒)。
- setOnPreparedListener(OnPreparedListener listener): 设置准备完成监听器,当视频准备就绪时被调用。
- setOnErrorListener(OnErrorListener listener): 设置错误监听器,当播放发生错误时被调用。
- setOnCompletionListener(OnCompletionListener listener): 设置播放完成监听器,当视频播放完毕时被调用。
- setOnCompletionListener(OnCompletionListener listener): 设置一个监听器,当视频播放完毕时会被调用。
- setOnInfoListener(OnInfoListener listener): 设置一个监听器,接收视频播放过程中的信息事件,如缓冲状态变化。
- setAudioStreamType(int streamtype): 设置音频流类型,例如
AudioManager.STREAM_MUSIC
。 - requestFocus(): 请求获得焦点,对于开始播放视频可能是必需的。
- setZOrderOnTop(boolean onTop): 设置VideoView的绘制层级,如果为
true
,VideoView将被绘制在最顶层。 - 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.构建视频URL:
Uri uri = Uri.parse("https://vdept3.bdstatic.com/...");
这里通过
Uri.parse()
方法构造了一个指向在线视频资源的URI。这个URL包含了视频的详细地址以及一些查询参数,如认证密钥、渠道来源等信息,确保视频播放请求的有效性和安全性。 -
2.设置视频源:
videoView.setVideoURI(uri);
使用
setVideoURI()
方法将刚刚构建的视频URI设置给VideoView,指定了待播放的视频资源。 -
3.创建MediaController并绑定:
MediaController mediaController = new MediaController(MainActivity.this); videoView.setMediaController(mediaController); mediaController.setAnchorView(videoView);
MediaController
是视频播放控制条,包含了播放/暂停、进度条、时间显示等功能。setMediaController()
将MediaController与VideoView绑定,使用户可以通过控制条来控制视频播放。setAnchorView()
设置MediaController依附的视图,通常就是VideoView本身,这样控制条会出现在VideoView附近。
-
4.视频准备完成的监听:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {videoView.start();} });
当VideoView成功加载视频资源并准备就绪后,
onPrepared()
回调会被触发,这时调用videoView.start()
开始播放视频。 -
5.视频播放错误的监听:
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mediaPlayer, int what, int extra) {return true; // 表示已经处理错误} });
如果视频加载或播放过程中发生错误,
onError()
会被调用。在这个例子中,错误被简单地捕获并返回true
,表明错误已被处理。在实际应用中,你可能希望在此处添加更详细的错误处理逻辑,比如显示错误消息给用户。 -
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视频组件博客最终效果