Android 获取在videoview下播放的视频的进度时间?

Android 获取在videoview下播放的视频的进度时间?,android,Android,我需要获得在“VideoView”中播放的视频的进度时间(即进度条左侧显示的时间) 任何帮助都将不胜感激。 谢谢。您可以使用getCurrentPosition()和getDuration()计算进度。您可以通过mVideoView.getDuration()获得视频的持续时间,最初将进度条设置为0,然后通过mVideoView.getCurrentPosition()获得视频的当前进度并根据当前视频进度百分比(%)将进度条状态增加(当前*100/持续时间)。我使用AsyncTask检验了这个完

我需要获得在“VideoView”中播放的视频的进度时间(即进度条左侧显示的时间)

任何帮助都将不胜感激。
谢谢。

您可以使用
getCurrentPosition()
getDuration()
计算进度。

您可以通过
mVideoView.getDuration()
获得视频的持续时间,最初将进度条设置为0,然后通过
mVideoView.getCurrentPosition()获得视频的当前进度
并根据当前视频进度百分比(%)将进度条状态增加
(当前*100/持续时间)
。我使用
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]);
        }
    }
}
公共类VideoPlayActivity扩展活动{
ProgressBar-mProgressBar;
视频视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
字符串路径=Environment.getExternalStorageDirectory().toString();
字符串filename=“/hr.3gp”;
mProgressBar=(ProgressBar)findViewById(R.id.ProgressBar);
mProgressBar.setProgress(0);
最大设置压力(100);
mVideoView=(VideoView)findviewbyd(R.id.my\u Video\u View);
mVideoView.setVideoURI(Uri.parse(path+filename));
新建MyAsync().execute();
}
私有类MyAsync扩展了AsyncTask
{
int持续时间=0;
int电流=0;
@凌驾
受保护的Void doInBackground(Void…参数){
mVideoView.start();
mVideoView.setOnPreparedListener(新的OnPreparedListener(){
已准备好公开作废(MediaPlayer mp){
duration=mVideoView.getDuration();
}
});
做{
current=mVideoView.getCurrentPosition();
系统输出打印项次(“持续时间-”+持续时间+“当前-”
+电流);
试一试{
出版进度(整数)(当前*100/时长);
如果(mProgressBar.getProgress()>=100){
打破
}
}捕获(例外e){
}

}而(mProgressBar.getProgress()您可以使用线程来实现此目的,如下所示:

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();                     
        }
    });
videoView.start();
videoView.setOnPreparedListener(新的OnPreparedListener(){
已准备好公开作废(MediaPlayer mp){
运行=真;
final int duration=videoView.getDuration();
新线程(newrunnable()){
public void run(){
做{
textView.post(新的Runnable(){
公开募捐{
int time=(duration-videoView.getCurrentPosition())/1000;
textView.setText(时间+“”);
}
});
试一试{
睡眠(500);
}捕获(中断异常e){
e、 printStackTrace();
}
如果(!运行)中断;
}

而(videoView.getCurrentPosition()我就是这样完成的

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);
}

如果您有问题,请随时提问。

您真的可以在
doInBackground
中调用
mVideoView.start();
吗?没有错误的线程异常?hi-Lalit。如果用户退出或关闭视频视图会发生什么?如何防止此异步任务无限执行?@android用户您可以调用
取消()必须从UI线程调用AsyncTaskmethod
setOnPreparedListener
上的方法。所有后台任务代码都应该从UI线程调用,但是,何时调用这些方法?因为我需要每秒跟踪一次。@narendra先生,您可以使用timer或thread sleep se参考上面Nolesh和Aleksey Timoshchenko的答案t到1000毫秒。我在
处理程序的帮助下实现了这一点。这导致textview中出现泄漏