android - 在视频之前显示进度对话框

标签 android video 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;
        }
    }


}

但我在这里没有看到进度条。我直接得到的只是视频。

感谢所有帮助。

最佳答案

不要在 runOnUiThread 中关闭进度对话框,而是在 onPreparedListener 中关闭它:

mVideoView.setOnPreparedListener(new OnPreparedListener() {

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

runOnUiThread 会立即被调用,因此在对话框可见之前将其关闭。此代码将使其继续运行,直到视频准备好开始。

关于android - 在视频之前显示进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922403/

相关文章:

java - 如何在一项 Activity 上扩展两个类(class)

android - 错误android studio restcomm hello-word项目

python - 用python进行视频编辑。使用mhmovie在python中合并.mp3和.mp4文件

java - 当线程完成并调用 dialog.dismiss() 时出现 WindowLeaked 异常;

android - 登录 Android 应用程序时的 Facebook 进度对话框微调器

android - 如何从 URI 获取完整的文件路径

android - 调用另一个小部件的 onClick 方法

android - 无法在 TextureView Android 中播放视频

video - Raspberry PI 相机到 Youtube 直播问题

android - Activity 泄漏了最初在此处添加的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0