2011-10-18 10 views
17

मुझे "वीडियो व्यू" में खेला गया वीडियो का प्रगति समय प्राप्त करना होगा (यानी प्रगति पट्टी में बाईं ओर दिखाए गए समय)।वीडियोव्यू के तहत खेले गए वीडियो का प्रगति समय प्राप्त करें?

किसी भी मदद की वास्तव में सराहना की जाएगी। धन्यवाद।

उत्तर

32

आप mVideoView.getDuration() द्वारा वीडियो की अवधि प्राप्त कर सकते हैं, शुरू में और फिर 0 पर प्रगति बार सेट mVideoView.getCurrentPosition(); द्वारा वीडियो की currentProgress हो और (current * 100/duration) द्वारा प्रतिशत (%) में वीडियो की CurrentProgress के आधार पर प्रगति बार स्थिति में वृद्धि । मैंने AsyncTask चेकआउट इस पूर्ण उदाहरण का उपयोग करके इसे आजमाया।

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<VideoView android:id="@+id/my_Video_View" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 

    <ProgressBar android:layout_alignParentBottom="true" 
    style="@android:style/Widget.ProgressBar.Horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="10dp" 
    android:id="@+id/Progressbar"/> 
</RelativeLayout> 

VideoPlayActivity.java

public class VideoPlayActivity extends Activity { 

    ProgressBar mProgressBar; 
    VideoView mVideoView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     String path = Environment.getExternalStorageDirectory().toString(); 
     String filename = "/hr.3gp"; 

     mProgressBar = (ProgressBar) findViewById(R.id.Progressbar); 
     mProgressBar.setProgress(0); 
     mProgressBar.setMax(100); 

     mVideoView = (VideoView) findViewById(R.id.my_Video_View); 
     mVideoView.setVideoURI(Uri.parse(path+filename)); 
     new MyAsync().execute(); 
    } 

    private class MyAsync extends AsyncTask<Void, Integer, Void> 
    { 
     int duration = 0; 
     int current = 0; 
     @Override 
     protected Void doInBackground(Void... params) { 

      mVideoView.start(); 
      mVideoView.setOnPreparedListener(new OnPreparedListener() { 

       public void onPrepared(MediaPlayer mp) { 
        duration = mVideoView.getDuration(); 
       } 
      }); 

      do { 
       current = mVideoView.getCurrentPosition(); 
       System.out.println("duration - " + duration + " current- " 
         + current); 
       try { 
        publishProgress((int) (current * 100/duration)); 
        if(mProgressBar.getProgress() >= 100){ 
         break; 
        } 
       } catch (Exception e) { 
       } 
      } while (mProgressBar.getProgress() <= 100); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      System.out.println(values[0]); 
      mProgressBar.setProgress(values[0]); 
     } 
    } 
} 
+4

क्या आप वास्तव में 'mVideoView.start();' 'doInBackground' में कॉल कर सकते हैं? कोई गलती नहीं अपवाद अपवाद? –

+2

हाय ललित। क्या होता है यदि उपयोगकर्ता VideoView से बाहर निकलता है या इसे बंद करता है? असीमित निष्पादन से इस AsyncTask को कैसे रोक सकता है? – codeshark

+0

@ एंड्रॉइड-उपयोगकर्ता आप स्पष्ट रूप से यूआई थ्रेड से अपने AsyncTask –

4

प्रगति की गणना के लिए आप getCurrentPosition() और getDuration() का उपयोग कर सकते हैं।

+0

लेकिन, ?, उन तरीकों कॉल करने के लिए जब तक मैं यह हर दूसरे ट्रैक करने के लिए की जरूरत है। – NarendraJi

+0

@ एमआर-नरेंद्र, आप टाइमर या धागा नींद सेट 1000 एमएस के साथ ऊपर नोलेश और Aleksey Timoshchenko के उत्तरों का उल्लेख कर सकते हैं। – Karthik

+0

मैंने 'हैंडलर' की मदद से इसे हासिल किया। – NarendraJi

5

आप इस उद्देश्य के नीचे की तरह के लिए थ्रेड का उपयोग कर सकते हैं:

videoView.start(); 
    videoView.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      running = true; 
      final int duration = videoView.getDuration(); 

      new Thread(new Runnable() { 
       public void run() { 
        do{       
         textView.post(new Runnable() { 
         public void run() { 
          int time = (duration - videoView.getCurrentPosition())/1000; 
          textView.setText(time+""); 
         } 
         }); 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) {          
          e.printStackTrace(); 
         } 
         if(!running) break; 
        } 
        while(videoView.getCurrentPosition()<duration); 
       } 
      }).start();      
     } 
    }); 
+0

से कॉल किया जाना चाहिए परिणामस्वरूप टेक्स्टव्यू में रिसाव – isudansh

1

मैं इसे इस तरह से पूरा किया

private void playVideo() { 
    setViewNotVisibility(); 

    final String videoSource = "android.resource://" + getPackageName() + File.separator + R.raw.moviiegood; 
    videoView.setKeepScreenOn(true); 
    videoView.setVideoURI(Uri.parse(videoSource)); 
    videoView.setMediaController(null); 
    videoView.setOnCompletionListener(myVideoViewCompletionListener); 
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
             @Override 
             public void onPrepared(MediaPlayer mp) { 
              startVideo(); 
              setDuration(); 
              timerCounter(); 
             } 
            } 

    ); 
} 

private Timer timer; 
private void timerCounter(){ 
    timer = new Timer(); 
    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        updateUI(); 
       } 
      }); 
     } 
    }; 
    timer.schedule(task, 0, 1000); 
} 

private int duration = 0; 

private void setDuration(){ 
    duration = videoView.getDuration(); 
} 

private void updateUI(){ 
    if (pbVideoView.getProgress() >= 100) { 
     timer.cancel(); 
    } 
    int current = videoView.getCurrentPosition(); 
    int progress = current * 100/duration; 
    pbVideoView.setProgress(progress); 
} 

आप एक सवाल है, तो पूछने के लिए स्वतंत्र

संबंधित मुद्दे