2010年11月15日 星期一

[Android] 如何使用VideoView播放影片



在之前的文章[Android Tips] 如何在Layout檔案中使用自訂的View , 成功的使用了自訂的VideoView了 , 現在該讓他播放個影片來看看 , 根據Android的文件 , 能播放的影音檔案為3gp和mp4 , 程式碼如下



import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;

public class CustomVideoViewTest extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        CVView = (CustomVideoView)findViewById(R.id.VideoView);
        MediaController controller = new MediaController(this); 
        CVView.setMediaController(controller); 
        //CVView.setVideoPath("android.resource://com.android/"+R.raw.video);
        //播放Local端的影音資源 , SD Card or res/raw 裡的影音檔
        CVView.setVideoURI(Uri.parse("http://www.dubblogs.cc:8751/Android/Test/Media/mp4/test.mp4"));
        //播放遠端的影音資源 , 影音串流
        CVView.requestFocus();
        CVView.start();
    }    
    CustomVideoView CVView;
}

另外應用程式要連接網路需要加上
android:name="android.permission.INTERNET : Allows applications to open network sockets

    


執行結果如下






另外關於VideoView大小的問題





  

可以看到VideoView的寬和高屬性都已經設為"fill_parent"了 , 但事實上執行的結果並不會填滿整個parent layout , 如果想更改大小的話目前比較簡單的方法是寬設為"xxdip"來解決 , 不過只有更改寬的dip才會起作用 , 高的部分怎麼改都一樣 , 應該是有更好的方法來修改VideoView的寬和高。在網路上看到一篇文章有解決這個問題 , 照他的方法做程式碼如下


import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.VideoView;

public class CustomVideoView extends VideoView
{

 public CustomVideoView(Context context)
 {
  super(context);
  // TODO Auto-generated constructor stub
  Log.d("Go to", "Context context");
 }

 public CustomVideoView(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  // TODO Auto-generated constructor stub
  mVideoWidth = 0;
     mVideoHeight = 0;
  Log.d("Go to", "Context context, AttributeSet attrs");
 } 
 //可以發現進入的是CustomVideoView(Context context, AttributeSet attrs)這個建構子
    //所以留著覆寫他 , 否則程式會強制關閉
 
 public void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
 {
  int width = getDefaultSize(mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(mVideoHeight, heightMeasureSpec);
        setMeasuredDimension(width,height);
 }
 
 private int mVideoWidth;
    private int mVideoHeight;
}


接著使用之前文章的 [Android Tips] 如何隱藏Title Bar和Notification Bar , 執行成功了結果如下












6 則留言:

  1. 設置videoview大小code看不懂...
    怎麼讀取檔案來源???

    回覆刪除
    回覆
    1. 1.單純使用xml檔案裡的 layout_height="fill_parent"是無法達到全螢幕的 , 所以要 override onMeasure(int,int)這個method來改變VideoView的大小達到全螢幕的效果 , 因為想分別取得xml檔案裡我們長和寬設定的layout寬和高所以使用 getDefaultSize()來獲取 ,當然你也可以在程式中取得螢幕的寬和高來設定 , 最後記得使用setMeasuredDimension(width,height)來儲存 , 所以能不能改變View的大小一切的關鍵都在onMeasure(int,int)method 中 使用setMeasuredDimension(width,height)。

      刪除
    2. 2.檔案來源是網路上的 Video file , 設定媒體來源的code在這行
      CVView.setVideoURI(Uri.parse("http://www.dubblogs.cc:8751/Android/Test/Media/mp4/test.mp4"));

      刪除
  2. 不播放耶 連開啟程式都有問題

    回覆刪除
  3. 請問如果我的影片700mb 放在遠端 然後我要邊讀取然後邊播放 這樣要怎麼實現

    回覆刪除
  4. 不好意思 我想請問一下 在模擬器是可以播放影片
    但為什麼在手機上就不能??
    會跳出無法撥放檔案的訊息
    手機版本是4.0的
    謝謝

    回覆刪除

Google Analytics