視頻

2011-02-07 32 views
2

我想用下面的代碼在影片開始前顯示ProgressDialog之前顯示progressdialog:視頻

package com.Boodang; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.webkit.URLUtil; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class VideoLoading extends Activity implements Runnable { 
    private static final String TAG = "VideoViewDemo"; 

    private VideoView mVideoView; 
    private EditText mPath; 
    private ImageView mPlay; 
    private ImageView mPause; 
    private ImageButton mReset; 
    private ImageView mStop; 
    private String current; 
    private ProgressDialog dialog; 
    private Context mContext; 
    String s=null; 
    @Override 
    public void onCreate(Bundle state){ 

    super.onCreate(state); 


    dialog=ProgressDialog.show(this,"","Loding.PleaseWait",true); 
    Thread t=new Thread(this); 
    t.start(); 
     Log.e("VideoPlay1 page","OnStart"); 
     setContentView(R.layout.videoplay); 


     mPlay = (ImageView) findViewById(R.id.play); 
     mPause = (ImageView) findViewById(R.id.pause); 

     mStop = (ImageView) findViewById(R.id.stop); 

     mPlay.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 

      } 
     }); 
     mPause.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       if (mVideoView != null) { 
        mVideoView.pause(); 
       } 
      } 
     }); 

     mStop.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       if (mVideoView != null) { 
        current = null; 
        mVideoView.stopPlayback(); 
       } 
      } 
     }); 
    runOnUiThread(new Runnable(){ 
     public void run() { 
       dialog.dismiss(); 
      } 

     }); 


    } 
    public void run(){ 
     Message msg; 
     handler.sendEmptyMessage(0); 
    } 
Handler handler=new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
     try { 

      mVideoView = (VideoView) findViewById(R.id.video); 
      s=getIntent().getStringExtra("id"); 

      final String path = s; 
      Log.v(TAG, "path: " + path); 
      if (path == null || path.length() == 0) { 
      Toast.makeText(VideoLoading.this, "File URL/path is empty", 
         Toast.LENGTH_LONG).show(); 

      } else { 
       // If the path has not changed, just start the media player 
       if (path.equals(current) && mVideoView != null) { 
        mVideoView.start(); 
        mVideoView.requestFocus(); 
       return; 
      } 
      current = path; 
       mVideoView.setVideoPath(getDataSource(path)); 
       mVideoView.start(); 
       mVideoView.requestFocus(); 


      } 
     } catch (Exception e) { 
      Log.e(TAG, "error123: " + e.getMessage(), e); 
      if (mVideoView != null) { 
       mVideoView.stopPlayback(); 
      } 
     } 

    } 
}; 
    private String getDataSource(String path) throws IOException { 
     if (!URLUtil.isNetworkUrl(path)) { 
      return path; 
     } else { 
      URL url = new URL(path); 
      URLConnection cn = url.openConnection(); 
      cn.connect(); 
      InputStream stream = cn.getInputStream(); 
      if (stream == null) 
       throw new RuntimeException("stream is null"); 
      File temp = File.createTempFile("mediaplayertmp", "dat"); 
      temp.deleteOnExit(); 
      String tempPath = temp.getAbsolutePath(); 
      FileOutputStream out = new FileOutputStream(temp); 
     byte buf[] = new byte[128]; 
      do { 
      int numread = stream.read(buf); 
       if (numread <= 0) 
        break; 
       out.write(buf, 0, numread); 


      } while (true); 

      try { 
       stream.close(); 

      } catch (IOException ex) { 
       Log.e(TAG, "error: " + ex.getMessage(), ex); 
      } 
      return tempPath; 
     } 
    } 


} 

但我沒有在這裏得到的進度條。我所得到的只是視頻。

所有幫助表示讚賞。

回答

4

而是在runOnUiThread駁回進度對話框,關閉它在onPreparedListener:

mVideoView.setOnPreparedListener(new OnPreparedListener() { 

    public void onPrepared(MediaPlayer arg0) { 
     dialog.dismiss(); 
     mVideoView.start(); 
    } 
}); 

runOnUiThread被稱爲馬上,因此dimissing的對話框,可以看到前。這段代碼會一直持續到視頻準備開始。

+0

你幫我..謝謝了很多...試圖找出爲什麼進度對話框不可見。 – Yogamurthy

0

你應該使用AsyncTask來做到這一點。看看this page。它提供了關於如何做你想做的事情的詳細信息。

0

您必須離開同步MediaPlayer調用才能執行此操作。 MediaPlayer有一系列播放器狀態更改回調,例如onPreparedListener,您需要使用該回調來確定何時顯示對話。

你所遇到的是由於這樣一個事實,即使你正在向uiThread投入工作,你基本上將所有的工作都放到了uiThread中。

召喚:

  mVideoView.setVideoPath(getDataSource(path)); 

是怎麼回事uiThread(貌似)。您需要使用異步偵聽器來避免爲自己構建這些設施。