/*
* Copyright (C) 2011 VOV IO (http://vov.io/)
*/
package com.bczm.widgetcollections.ui.activity;
import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnInfoListener;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.Display;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import com.bczm.widgetcollections.R;
import com.bczm.widgetcollections.common.Constants;
import com.bczm.widgetcollections.http.ConfigManage;
import com.bczm.widgetcollections.utils.LogUtils;
import com.bczm.widgetcollections.utils.UIUtils;
public class VideoPlayerActivity extends Activity implements OnCompletionListener, OnInfoListener {
private String mPath="";
private String mTitle="";
private VideoView mVideoView;
private View mVolumeBrightnessLayout;
private ImageView mOperationBg;
private ImageView mOperationPercent;
private AudioManager mAudioManager;
/** 最大声音 */
private int mMaxVolume;
/** 当前声音 */
private int mVolume = -1;
/** 当前亮度 */
private float mBrightness = -1f;
/** 当前缩放模式 */
private int mLayout = VideoView.VIDEO_LAYOUT_STRETCH;
private GestureDetector mGestureDetector;
private MediaController mMediaController;
private View mLoadingView;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
mPath=getIntent().getStringExtra(Constants.INTENT_BUNDLE_KEY_CHANNEL_PATH);
mTitle=getIntent().getStringExtra(Constants.INTENT_BUNDLE_KEY_CHANNEL_TITLE);
// ~~~ 检测Vitamio是否解压解码包
// LibsChecker.checkVitamioLibs()Error:Execution failed for task ':app:dexDebug'.
// > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\Work Space\Java\jdk1.7.0_13\bin\java.exe'' finished with non-zero exit value 2
if (!LibsChecker.checkVitamioLibs(this))
// if (!LibsChecker.checkVitamioLibs(this, R.string.init_decoders))
return;
// ~~~ 获取播放地址和标题
// Intent intent = getIntent();
// mPath = intent.getStringExtra("path");
// mPath="rtmp://live.hkstv.hk.lxdns.com/live/hks";
// mTitle = "-------------------------title";
// mTitle = intent.getStringExtra("title");
if (TextUtils.isEmpty(mPath)) {
mPath = ConfigManage.URL_SPLASH; // 如果 url null 传递 splash video
}
// else if (intent.getData() != null)
// mPath = intent.getData().toString();
// ~~~ 绑定控件
setContentView(R.layout.videoview);
mVideoView = (VideoView) findViewById(R.id.surface_view);
mVolumeBrightnessLayout = findViewById(R.id.operation_volume_brightness);
mOperationBg = (ImageView) findViewById(R.id.operation_bg);
mOperationPercent = (ImageView) findViewById(R.id.operation_percent);
mLoadingView = findViewById(R.id.video_loading);
// ~~~ 绑定事件
mVideoView.setOnCompletionListener(this);
mVideoView.setOnInfoListener(this);
// ~~~ 绑定数据
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
if (mPath.startsWith("http:"))
mVideoView.setVideoURI(Uri.parse(mPath));
else
mVideoView.setVideoPath(mPath);
//设置显示名称
mMediaController=new MediaController(UIUtils.getContext(),new MediaController.Controller( ){
@Override
public View.OnClickListener getShareClickListener() {
View. OnClickListener shareController=new View.OnClickListener() {
@Override
public void onClick(View view) {
LogUtils.e("分享操作_____before click____"+mLayout);
}
};
return shareController;
}
@Override
public View.OnClickListener getBackClickListener() {
View. OnClickListener backCOntroller=new View.OnClickListener() {
@Override
public void onClick(View view) {
mVideoView.stopPlayback();
VideoPlayerActivity.this.finish();
}
};
return backCOntroller;
}
@Override
public View.OnClickListener selectedSizeListener(final ImageButton mChangeSize) {
View. OnClickListener shareController=new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mLayout == VideoView.VIDEO_LAYOUT_STRETCH)
mLayout = VideoView.VIDEO_LAYOUT_ORIGIN;
else
mLayout++;
// if(mLayout==VideoView.VIDEO_LAYOUT_STRETCH){// 横竖屏切换记得 给activity 设置 configchange 属性 android:configChanges="orientation|keyboardHidden|screenSize"
//// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
//// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
// }else{
//// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// }
if(mLayout== VideoView.VIDEO_LAYOUT_ORIGIN){
//最小
mChangeSize.setBackgroundResource(R.mipmap.ic_ar_4_3_inside);
}else if(mLayout==VideoView.VIDEO_LAYOUT_SCALE){
//80%
mChangeSize.setBackgroundResource(R.mipmap.ic_ar_16_9_inside);
}else if(mLayout==VideoView.VIDEO_LAYOUT_STRETCH){
//全屏
mChangeSize.setBackgroundResource(R.mipmap.ic_ar_adjust_screen);
}
LogUtils.e("mLayout:"+mLayout);
if (mVideoView != null)
mVideoView.setVideoLayout(mLayout, 0);
// public static final int VIDEO_LAYOUT_ORIGIN = 0;
// public static final int VIDEO_LAYOUT_SCALE = 1;
// public static final int VIDEO_LAYOUT_STRETCH = 2;
// public static final int VIDEO_LAYOUT_ZOOM = 3;
// public static final int VIDEO_LAYOUT_FIT_PARENT = 4;
}
};
return shareController;
}
});
LogUtils.e("------------------------------------mTitle--------------------------------:" + mTitle);
mVideoView.setMediaController(mMediaController);
mMediaController.setFileName(mTitle);
mVideoView.requestFocus();
mGestureDetector = new GestureDetector(this, new MyGestureListener());
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ViewTreeObserver vto = mVideoView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mVideoView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mVideoView.getHeight();
mVideoView.getWidth();
// mMediaController.setPadding(0, 0, 0,mVideoView.getBottom());
LogUtils.e("ViewTreeObserver:\tmVideoView.getHeight();:"+ mVideoView.getHeight()+"mVideoView.getWidth();"+mVideoView.getWidth());
}
});
}
@Override
protected void onPause() {
super.onPause();
if (mVideoView != null)
mVideoView.pause();
}
@Override
protected void onResume() {
super.onResume();
if (mVideoView != null)
mVideoView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mVideoView != null)
mVideoView.stopPlayback();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mGestureDetector.onTouchEvent(event))
return true;
// 处理手势结束
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
endGesture();
break;
}
return super.onTouchEvent(event);
}
/** 手势结束 */
private void endGesture() {
mVolume = -1;
mBrightness = -1f;
// 隐藏
mDismissHandler.removeMessages(0);
mDismissHandler.sendEmptyMessageDelayed(0, 500);
}
private class MyGestureListener extends SimpleOnGestureListener {
/** 双击 */
@Override
public boolean onDoubleTap(MotionEvent e) {
if (mLayout == VideoView.VIDEO_LAYOUT_ZOOM)
mLayout = VideoView.VIDEO_LAYOUT_ORIGIN;
else
mLayout++;
if (mVideoView != null)
mVideoView.setVideoLayout(mLayout, 0);
return true;
}
/** 滑动 */
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
float mOldX = e1.getX(), mOldY = e1.getY();
int y = (int) e2.getRawY();
Display disp = getWindowManager().getDefaultDisplay();
int windowWidth = disp.getWidth();
int windowHeight = disp.getHeight();
if (mOldX > windowWidth * 4.0 / 5)// 右边滑动
onVolumeSlide((mOldY - y) / windowHeight);
else if (mOldX < windowWidth / 5.0)// 左边滑动
onBrightnessSlide((mOldY - y) / windowHeight);
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
/** 定时隐藏 */
private Handler mDismissHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mVolumeBrightnessLayout.setVisibility(View.GONE);
}
};
/**
* 滑动改变声音大小
*
* @param percent
*/
private void onVolumeSlide(float percent) {
if (mVolume == -1) {
mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
if (mVolume < 0)
mVolume = 0;
// 显示
mOperationBg.setImageResource(R.mipmap.video_volumn_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}
int index = (int) (percent * mMaxVolume) + mVolume;
if (index > mMaxVolume)
index = mMaxVolume;
else if (index < 0)
index = 0;
// 变更声音
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
// 变更进度条
ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
mOperationPercent.setLayoutParams(lp);
}
/**
* 滑动改变亮度
*
* @param percent
*/
private void onBrightnessSlide(float percent) {
if (mBrightness < 0) {
mBrightness = getWindow().getAttributes().screenBrightness;
if (mBrightness <= 0.00f)
mBrightness = 0.50f;
if (mBrightness < 0.01f)
mBrightness = 0.01f;
// 显示
mOperationBg.setImageResource(R.mipmap.video_brightness_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}
WindowManager.LayoutParams lpa = getWindow().getAttributes();
lpa.screenBrightness = mBrightness + percent;
if (lpa.screenBrightness > 1.0f)
lpa.screenBrightness = 1.0f;
else if (lpa.screenBrightness < 0.01f)
lpa.screenBrightness = 0.01f;
getWindow().setAttributes(lpa);
ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
mOperationPercent.setLayoutParams(lp);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (mVideoView != null)
mVideoView.setVideoLayout(mLayout, 0);
super.onConfigurationChanged(newConfig);
}
@Override
public void onCompletion(MediaPlayer player) {
finish();
}
private void stopPlayer() {
if (mVideoView != null)
mVideoView.pause();
}
private void startPlayer() {
if (mVideoView != null)
mVideoView.start();
}
private boolean isPlaying() {
return mVideoView != null && mVideoView.isPlaying();
}
/** 是否需要自动恢复播放,用于自动暂停,恢复播放 */
// private boolean needResume;
private boolean needResume=true;
@Override
public boolean onInfo(MediaPlayer arg0, int arg1, int arg2) {
switch (arg1) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
//开始缓存,暂停播放
if (isPlaying()) {
stopPlayer();
needResume = true;
}
mLoadingView.setVisibility(View.VISIBLE);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
//缓存完成,继续播放
if (needResume)
startPlayer();
mLoadingView.setVisibility(View.GONE);
break;
case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
//显示 下载速度
LogUtils.e("download rate:" + arg2);
//mListener.onDownloadRateChanged(arg2);
break;
}
return true;
}
}