Android通過VideoView實現視頻播放


在Android系統中,是通過MediaPalyer類播放媒體文件的(包括視頻和音頻)。雖然這個類已經比較簡單了,但是還需要控制各種狀態,對於視頻還需要設置輸出窗口,還是需要仔細研究的。為了避免這些麻煩事兒,Android框架提供了VideoView類來封裝MediaPalyer,這個VideoView類非常好用。Android自帶的程序Gallery也是用VideoView實現的。本文以實例介紹怎樣用VideoView來實現VideoPlayer,本文也參考了Android自帶程序Gallery的實現。

創建一個VideoPlayer的工程。main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <VideoView android:id="@+id/video_view"
8 android:layout_width="match_parent"
9 android:layout_height="match_parent"
10 android:layout_centerInParent="true" />
11 </LinearLayout>

VideoPlayer.java文件如下:

View Code
 1 package com.simon;
2
3 import android.app.Activity;
4 import android.media.MediaPlayer;
5 import android.net.Uri;
6 import android.os.Bundle;
7 import android.os.Environment;
8 import android.util.Log;
9 import android.widget.MediaController;
10 import android.widget.VideoView;
11 import android.content.pm.ActivityInfo;
12
13 public class VideoPlayer extends Activity implements MediaPlayer.OnErrorListener,
14 MediaPlayer.OnCompletionListener {
15 public static final String TAG = "VideoPlayer";
16 private VideoView mVideoView;
17 private Uri mUri;
18 private int mPositionWhenPaused = -1;
19
20 private MediaController mMediaController;
21
22 /** Called when the activity is first created. */
23 @Override
24 public void onCreate(Bundle savedInstanceState) {
25 super.onCreate(savedInstanceState);
26
27 setContentView(R.layout.main);
28
29 //Set the screen to landscape.
30 this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
31
32 mVideoView = (VideoView)findViewById(R.id.video_view);
33
34 //Video file
35 mUri = Uri.parse(Environment.getExternalStorageDirectory() + "/1.3gp");
36
37 //Create media controller
38 mMediaController = new MediaController(this);
39 mVideoView.setMediaController(mMediaController);
40 }
41
42 public void onStart() {
43 // Play Video
44 mVideoView.setVideoURI(mUri);
45 mVideoView.start();
46
47 super.onStart();
48 }
49
50 public void onPause() {
51 // Stop video when the activity is pause.
52 mPositionWhenPaused = mVideoView.getCurrentPosition();
53 mVideoView.stopPlayback();
54 Log.d(TAG, "OnStop: mPositionWhenPaused = " + mPositionWhenPaused);
55 Log.d(TAG, "OnStop: getDuration = " + mVideoView.getDuration());
56
57 super.onPause();
58 }
59
60 public void onResume() {
61 // Resume video player
62 if(mPositionWhenPaused >= 0) {
63 mVideoView.seekTo(mPositionWhenPaused);
64 mPositionWhenPaused = -1;
65 }
66
67 super.onResume();
68 }
69
70 public boolean onError(MediaPlayer player, int arg1, int arg2) {
71 return false;
72 }
73
74 public void onCompletion(MediaPlayer mp) {
75 this.finish();
76 }
77 }

本例中只是播放外存儲器(一般是sd卡)上的1.3gp文件。在onCreate方法中創建了Media control,這個組件可以控制視頻的播放,暫停,回復,seek等操作,不需要你實現。

1 mMediaController = new MediaController(this);
2 mVideoView.setMediaController(mMediaController);

然后只需要調用VideoView類的setVideoURI設置播放文件,start方法開始播放即可。 為了節省系統資源,一般需要在Activity的onPause方法中,暫停視頻的播放。因為Activity已經不在前台了。在Activity的onResume中恢復視頻的播放,因為這是Activity又變成前台程序了。不清楚的朋友可以去查看Activity lifecycle。 你可以通過實現MediaPlayer.OnErrorListener來監聽MediaPlayer上報的錯誤信息。實現MediaPlayer.OnCompletionListener接口,將會在Video播完的時候得到通知,本例只是簡單的結束程序。 你可能注意到,我們沒有管理MediaPalyer的各種狀態,這些狀態都讓VideoView給封裝了,並且,當VideoView創建的時候,MediaPalyer對象將會創建,當VideoView對象銷毀的時候,MediaPlayer對象將會釋放。這樣基本可以傻瓜式的實現媒體播放器了,太Easy了吧。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM