Android Open Source - VideoExtand Video Player Activity






From Project

Back to project page VideoExtand.

License

The source code is released under:

Apache License

If you think the Android project VideoExtand listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2014?1?4? The Android Open Source Project
 */*w  w w  .j  av a2 s . c o m*/
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Auther?yinglovezhuzhu@gmail.com
 * FileName:ReadVideoResp.java
 * Date?2014?1?6?
 * Version?v1.0
 */  
package com.yuninfo.videoextand.player;

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

import android.content.res.Resources;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;

import com.yuninfo.videoextand.BaseActivity;
import com.yuninfo.videoextand.Config;
import com.yuninfo.videoextand.utils.HttpUtil;
import com.yuninfo.videoextand.utils.LogUtil;
import com.yuninfo.videoextand.utils.StringUtil;

/**
 * ???
 * 
 * @author yinglovezhuzhu@gmail.com
 */
public class VideoPlayerActivity extends BaseActivity {
  
  private final static String TAG = VideoPlayerActivity.class.getSimpleName();

  private VideoView mVideoView;
  private TextView tvcache;
  private View mLoadingView;
  private String remoteUrl;
  private String localUrl;
//  private ProgressDialog progressDialog = null;

  private static final int READY_BUFF = 2000 * 1024;
  private static final int CACHE_BUFF = 500 * 1024;

  private boolean isready = false;
  private boolean iserror = false;
  private int errorCnt = 0;
  private int curPosition = 0;
  private long mediaLength = 0;
  private long readSize = 0;
  
  private Resources mResources;
  private String mPackageName;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    mResources = getResources();
    mPackageName = getPackageName();
    
    if(!HttpUtil.isNetworkAvairable(this)) {
      finish();
    }
    
    int layoutId = mResources.getIdentifier("yuninfo_activity_player", "layout", mPackageName);
    setContentView(layoutId);

    initData();

    initViews();
    playvideo();
  }
  
  private void initData() {
    if(hasExtra(Config.YUNINFO_EXTRA_URL)) {
      this.remoteUrl = getStringExtra(Config.YUNINFO_EXTRA_URL);
    } else {
      setResult(RESULT_CANCELED);
      finish();
      return;
    }
    if(StringUtil.isEmpty(remoteUrl)) {
      setResult(RESULT_CANCELED);
      finish();
      return;
    }
  }

  private void initViews() {
    
    this.mVideoView = (VideoView) findViewById(mResources.getIdentifier("yuninfo_vv_player_videoview", "id", mPackageName));
    this.tvcache = (TextView) findViewById(mResources.getIdentifier("yuninfo_tv_player_cache_state", "id", mPackageName));
    this.mLoadingView = findViewById(mResources.getIdentifier("yuninfo_ll_player_loading_view", "id", mPackageName));

    this.localUrl = getStringExtra("cache");

    mVideoView.setMediaController(new MediaController(this));

    mVideoView.setOnPreparedListener(new OnPreparedListener() {

      public void onPrepared(MediaPlayer mediaplayer) {
        dismissProgressDialog();
        mVideoView.seekTo(curPosition);
        mediaplayer.start();
      }
    });

    mVideoView.setOnCompletionListener(new OnCompletionListener() {

      public void onCompletion(MediaPlayer mediaplayer) {
        curPosition = 0;
        mVideoView.pause();
      }
    });

    mVideoView.setOnErrorListener(new OnErrorListener() {

      public boolean onError(MediaPlayer mediaplayer, int i, int j) {
        iserror = true;
        errorCnt++;
        mVideoView.pause();
        showProgressDialog();
        return true;
      }
    });
  }

  private void showProgressDialog() {
    mHandler.post(new Runnable() {

      @Override
      public void run() {
//        if (progressDialog == null) {
//          progressDialog = ProgressDialog.show(VideoPlayerActivity.this,
//              "????", "??????? ...", true, false);
//        }
        mLoadingView.setVisibility(View.VISIBLE);
      }
    });
  }

  private void dismissProgressDialog() {
    mHandler.post(new Runnable() {

      @Override
      public void run() {
//        if (progressDialog != null) {
//          progressDialog.dismiss();
//          progressDialog = null;
//        }
        mLoadingView.setVisibility(View.GONE);
      }
    });
  }

  private void playvideo() {
    if (!URLUtil.isNetworkUrl(this.remoteUrl)) {
      mVideoView.setVideoPath(this.remoteUrl);
      mVideoView.start();
      return;
    }

    showProgressDialog();

    new Thread(new Runnable() {

      @Override
      public void run() {
        FileOutputStream out = null;
        InputStream is = null;

        try {
          URL url = new URL(remoteUrl);
          HttpURLConnection httpConnection = (HttpURLConnection) url
              .openConnection();

          if (StringUtil.isEmpty(localUrl)) {
            localUrl = Environment.getExternalStorageDirectory()
                .getAbsolutePath()
                + "/VideoCache/"
                + System.currentTimeMillis() + ".mp4";
          }

          LogUtil.i(TAG, "localUrl: " + localUrl);

          File cacheFile = new File(localUrl);

          if (!cacheFile.exists()) {
            cacheFile.getParentFile().mkdirs();
            cacheFile.createNewFile();
          }

          readSize = cacheFile.length();
          out = new FileOutputStream(cacheFile, true);

          httpConnection.setRequestProperty("User-Agent", "NetFox");
          httpConnection.setRequestProperty("RANGE", "bytes="
              + readSize + "-");

          is = httpConnection.getInputStream();

          mediaLength = httpConnection.getContentLength();
          if (mediaLength == -1) {
            return;
          }

          mediaLength += readSize;

          byte buf[] = new byte[4 * 1024];
          int size = 0;
          long lastReadSize = 0;

          mHandler.sendEmptyMessage(VIDEO_STATE_UPDATE);

          while ((size = is.read(buf)) != -1) {
            try {
              out.write(buf, 0, size);
              readSize += size;
            } catch (Exception e) {
              e.printStackTrace();
            }

            if (!isready) {
              if ((readSize - lastReadSize) > READY_BUFF) {
                lastReadSize = readSize;
                mHandler.sendEmptyMessage(CACHE_VIDEO_READY);
              }
            } else {
              if ((readSize - lastReadSize) > CACHE_BUFF
                  * (errorCnt + 1)) {
                lastReadSize = readSize;
                mHandler.sendEmptyMessage(CACHE_VIDEO_UPDATE);
              }
            }
          }

          mHandler.sendEmptyMessage(CACHE_VIDEO_END);
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          if (out != null) {
            try {
              out.close();
            } catch (IOException e) {
              //
            }
          }

          if (is != null) {
            try {
              is.close();
            } catch (IOException e) {
              //
            }
          }
        }

      }
    }).start();

  }

  private final static int VIDEO_STATE_UPDATE = 0;
  private final static int CACHE_VIDEO_READY = 1;
  private final static int CACHE_VIDEO_UPDATE = 2;
  private final static int CACHE_VIDEO_END = 3;

  private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      switch (msg.what) {
      case VIDEO_STATE_UPDATE:
        double cachepercent = readSize * 100.00 / mediaLength * 1.0;
        String s = String.format("???: [%.2f%%]", cachepercent);

        if (mVideoView.isPlaying()) {
          curPosition = mVideoView.getCurrentPosition();
          int duration = mVideoView.getDuration();
          duration = duration == 0 ? 1 : duration;

          double playpercent = curPosition * 100.00 / duration * 1.0;

          int i = curPosition / 1000;
          int hour = i / (60 * 60);
          int minute = i / 60 % 60;
          int second = i % 60;

          s += String.format(" ??: %02d:%02d:%02d [%.2f%%]", hour,
              minute, second, playpercent);
        }

        tvcache.setText(s);

        mHandler.sendEmptyMessageDelayed(VIDEO_STATE_UPDATE, 1000);
        break;

      case CACHE_VIDEO_READY:
        isready = true;
        mVideoView.setVideoPath(localUrl);
        mVideoView.start();
        break;

      case CACHE_VIDEO_UPDATE:
        if (iserror) {
          mVideoView.setVideoPath(localUrl);
          mVideoView.start();
          iserror = false;
        }
        break;

      case CACHE_VIDEO_END:
//        if (iserror) {
          isready = true;
          mVideoView.setVideoPath(localUrl);
          mVideoView.start();
          iserror = false;
//        }
        break;
      }

      super.handleMessage(msg);
    }
  };
  
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK) {
      setResult(isready ? RESULT_OK : RESULT_CANCELED);
      finish();
      return true;
    }
    return super.onKeyDown(keyCode, event);
  }
}




Java Source Code List

com.example.androidtest.MainActivity.java
com.yuninfo.videoextand.BaseActivity.java
com.yuninfo.videoextand.Config.java
com.yuninfo.videoextand.ReadCardActivity.java
com.yuninfo.videoextand.SendCardActivity.java
com.yuninfo.videoextand.bean.CommonReq.java
com.yuninfo.videoextand.bean.ReadVideoResp.java
com.yuninfo.videoextand.bean.SendVideoResp.java
com.yuninfo.videoextand.bean.UploadReq.java
com.yuninfo.videoextand.bean.UploadResp.java
com.yuninfo.videoextand.player.VideoPlayerActivity.java
com.yuninfo.videoextand.recorder.RecorderActivity.java
com.yuninfo.videoextand.uploader.ProgressListener.java
com.yuninfo.videoextand.uploader.ProgressMultipartEntity.java
com.yuninfo.videoextand.uploader.ProgressOutputStream.java
com.yuninfo.videoextand.uploader.UploadHandler.java
com.yuninfo.videoextand.uploader.UploadThread.java
com.yuninfo.videoextand.utils.BeanRefUtil.java
com.yuninfo.videoextand.utils.DateUtil.java
com.yuninfo.videoextand.utils.FileUtil.java
com.yuninfo.videoextand.utils.HttpUtil.java
com.yuninfo.videoextand.utils.LogUtil.java
com.yuninfo.videoextand.utils.StringUtil.java
com.yuninfo.videoextand.widget.CustomPopupWindow.java
com.yuninfo.videoextand.widget.TitleBar.java
com.yuninfo.videoextand.widget.dialog.MenuDialog.java