Back to project page VideoExtand.
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.
/* * 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); } }