Android VideoView
时间:2020-02-23 14:29:22 来源:igfitidea点击:
在本教程中,我们将学习Android VideoView。
我们将在Android Studio中创建一个android应用并从URL播放视频,我们还将对其控制面板进行一些自定义。
Android VideoView
Android VideoView类用于其中显示视频文件。
以下是可接受的格式:
- 3gp
- MP4 –仅H.263,H.264,H.264编解码器有效。
VideoView可以播放来自资源文件,本地数据或者指定URL的视频。
以下是VideoView上使用的一些方法:
- setVideoURI()–用于设置URL路径。它需要解析为URI。
- setVideoPath()–用于本地路径。
- start()
- stopPlayback()
- seekTo(int milliSec)
- pause()
- resume()
- isPlaying()
- canPause()
- canSeekForward()
- canSeekBackward()
- setOnCompletedListener()
- addSubtitleSource()
- setMediaController():用于在视频上添加MediaControls。暂停/播放,搜寻
- getDuration()
- setOnPreparedListener():视频开始播放后被调用。
注意:进入背景时,VideoView不会保留其完整状态。
在下一节中,我们将创建一个应用程序,该应用程序一个接一个地运行来自url的视频。
我们将看到MediaController与VideoView一起工作。
Android VideoView示例
不要忘记在您的AndroidManifest.xml文件中添加Internet权限。
Android VideoView示例代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.theitroad.videoview.MainActivity"> <TextView android:id="@+id/txtPlaceholder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/videoView" android:layout_centerHorizontal="true" android:layout_margin="16dp" android:text="DOUBLE TAP TO VIEW CONTROLS" android:textStyle="bold" <VideoView android:id="@+id/videoView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" </RelativeLayout>
MainActivity.java
MainActivity.java的代码如下所示:
package com.theitroad.videoview; import android.media.MediaPlayer; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; import java.util.ArrayList; import java.util.Arrays; public class MainActivity extends AppCompatActivity { VideoView videoView; ArrayList<String> arrayList = new ArrayList<>(Arrays.asList("https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4")); int index = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = findViewById(R.id.videoView); final MediaController mediacontroller = new MediaController(this); mediacontroller.setAnchorView(videoView); videoView.setMediaController(mediacontroller); videoView.setVideoURI(Uri.parse(arrayList.get(index))); videoView.requestFocus(); videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Toast.makeText(getApplicationContext(), "Video over", Toast.LENGTH_SHORT).show(); if (index++ == arrayList.size()) { index = 0; mp.release(); Toast.makeText(getApplicationContext(), "Video over", Toast.LENGTH_SHORT).show(); } else { videoView.setVideoURI(Uri.parse(arrayList.get(index))); videoView.start(); } } }); videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.d("API123", "What " + what + " extra " + extra); return false; } }); } }
我们在ArrayList中添加了两个网址。
我们在VideoView上设置了anchorView(),以将MediaControl保留在VideoView中。
输出看起来像这样:
MediaControl为什么在VideoView之外?
好吧,直到视频开始播放之前,MediaControl才知道VideoView的尺寸。
为了在视频中拥有媒体控制权,我们需要在VideoView上设置" onPreparedListener",然后其中设置锚点。
这样,可以在VideoView内部设置MediaController。
我们更新后的MainActivity.java类现在看起来像这样:
package com.theitroad.videoview; import android.media.MediaPlayer; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; import java.util.ArrayList; import java.util.Arrays; public class MainActivity extends AppCompatActivity { VideoView videoView; ArrayList<String> arrayList = new ArrayList<>(Arrays.asList("https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4")); int index = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = findViewById(R.id.videoView); final MediaController mediacontroller = new MediaController(this); mediacontroller.setAnchorView(videoView); videoView.setMediaController(mediacontroller); videoView.setVideoURI(Uri.parse(arrayList.get(index))); videoView.requestFocus(); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { videoView.setMediaController(mediacontroller); mediacontroller.setAnchorView(videoView); } }); } }); videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Toast.makeText(getApplicationContext(), "Video over", Toast.LENGTH_SHORT).show(); if (index++ == arrayList.size()) { index = 0; mp.release(); Toast.makeText(getApplicationContext(), "Videos completed", Toast.LENGTH_SHORT).show(); } else { videoView.setVideoURI(Uri.parse(arrayList.get(index))); videoView.start(); } } }); videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.d("API123", "What " + what + " extra " + extra); return false; } }); } }
设置mp.release()以释放媒体播放器资源。
应该这样做以防止内存泄漏。
在此行之后的任何videoView调用都将导致CRASH。