|
@@ -0,0 +1,905 @@
|
|
|
+package com.edufound.mobile.video;
|
|
|
+
|
|
|
+import android.app.Dialog;
|
|
|
+import android.content.Context;
|
|
|
+import android.content.Intent;
|
|
|
+import android.graphics.Bitmap;
|
|
|
+import android.graphics.BitmapFactory;
|
|
|
+import android.graphics.Color;
|
|
|
+import android.graphics.drawable.AnimationDrawable;
|
|
|
+import android.graphics.drawable.Drawable;
|
|
|
+import android.media.AudioManager;
|
|
|
+import android.media.MediaPlayer;
|
|
|
+import android.net.Uri;
|
|
|
+import android.os.Bundle;
|
|
|
+import android.os.Handler;
|
|
|
+import android.os.Message;
|
|
|
+import android.view.Display;
|
|
|
+import android.view.GestureDetector;
|
|
|
+import android.view.Gravity;
|
|
|
+import android.view.KeyEvent;
|
|
|
+import android.view.LayoutInflater;
|
|
|
+import android.view.MotionEvent;
|
|
|
+import android.view.View;
|
|
|
+import android.view.ViewGroup;
|
|
|
+import android.view.Window;
|
|
|
+import android.view.WindowManager;
|
|
|
+import android.widget.FrameLayout;
|
|
|
+import android.widget.ImageView;
|
|
|
+import android.widget.LinearLayout;
|
|
|
+import android.widget.SeekBar;
|
|
|
+import android.widget.TextView;
|
|
|
+
|
|
|
+import com.edufound.mobile.R;
|
|
|
+import com.edufound.mobile.application.EApplication;
|
|
|
+import com.edufound.mobile.base.BaseModel;
|
|
|
+import com.edufound.mobile.base.BasePersenter;
|
|
|
+import com.edufound.mobile.util.AesUtil;
|
|
|
+import com.edufound.mobile.util.ContextUtil;
|
|
|
+import com.edufound.mobile.util.DeviceUtil;
|
|
|
+import com.edufound.mobile.util.DrawableUtil;
|
|
|
+import com.edufound.mobile.util.EduFoundUtil;
|
|
|
+import com.edufound.mobile.util.Logger;
|
|
|
+import com.edufound.mobile.util.ToastUtil;
|
|
|
+import com.edufound.mobile.view.ErrorView;
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.warkiz.widget.IndicatorSeekBar;
|
|
|
+import com.warkiz.widget.TickMarkType;
|
|
|
+
|
|
|
+public class VideoPersenter implements VideoIPersenter, GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
|
|
|
+
|
|
|
+ private VideoPersenter mPersenter;
|
|
|
+ private VideoAView mView = null;
|
|
|
+ private VideoModel mModel = null;
|
|
|
+ private FrameLayout mFrameController;
|
|
|
+ private LinearLayout mPlayerController;
|
|
|
+ private FrameLayout mOtherFrame;
|
|
|
+ private ImageView mPlayerBack;
|
|
|
+ private ImageView mPlayerLoading;
|
|
|
+ public ImageView mPlayerStatus;
|
|
|
+ private Gson mGson;
|
|
|
+ private VideoJsonBean[] mVideoBean;
|
|
|
+ private TextView mVideoName;
|
|
|
+ private ImageView mLittleIcon;
|
|
|
+ private TextView mCurrent;
|
|
|
+ private SeekBar mSeekbar;
|
|
|
+ private int SEEK_COUNT = 1; //用来控制长按快进的seek_progress
|
|
|
+ final int SEEK_PROGRESS = 1000;
|
|
|
+ final int HIDE_CONTROLLER_TIME = 5000;
|
|
|
+ final int SET_INFO = 0x7891;
|
|
|
+ final int SHOW_CONTROLLER = 0x7892;
|
|
|
+ final int HIDE_CONTROLLER = 0x7893;
|
|
|
+ final int STATUS_PLAY = 0x8891;
|
|
|
+ final int STATUS_PAUSE = 0x8892;
|
|
|
+ final int STATUS_FORWARD = 0x8893;
|
|
|
+ final int STATUS_REWIND = 0x8894;
|
|
|
+ final int SHOW_STATUS_IMAGE = 0x8895;
|
|
|
+ final int HIDE_STATUS_IMAGE = 0x8896;
|
|
|
+ final int PLAY_NEXT = 0x8897;
|
|
|
+ final int DISCONNECT_NETWORK = 0x8898;
|
|
|
+ final int CONNECT_NETWORK = 0x9989;
|
|
|
+ final int SHOW_TOUCHVIEW = 0x8899;
|
|
|
+ final int HIDE_TOUCHVIEW = 0x8890;
|
|
|
+ //单独播放,播放完成直接关闭
|
|
|
+ final int TYPE_SEPARATELY_PLAY = 0;
|
|
|
+ //单独循环播放,一直循环
|
|
|
+ final int TYPE_SINGLECYCLE_PLAY = 1;
|
|
|
+ //列表播放,播放完列表关闭
|
|
|
+ final int TYPE_LIST_PLAY = 2;
|
|
|
+ AnimationDrawable mLoadingAnim;
|
|
|
+ private int mStatusCode;
|
|
|
+ Bitmap mStatusPlayBitmap;
|
|
|
+ Bitmap mLittleIconPlayBitmap;
|
|
|
+ Bitmap mLittleIconPauseBitmap;
|
|
|
+ int mPlayIndex;
|
|
|
+ int mPlayType;
|
|
|
+ String mPlayingId;
|
|
|
+ String mPlayNeedPost;
|
|
|
+ int mPlayStartTime;
|
|
|
+ String SINGLECYCLE_URL = "";
|
|
|
+ ErrorView mErrorView;
|
|
|
+ Dialog mErrorViewDialog;
|
|
|
+ int mPlayerBackTime;
|
|
|
+ String mPlayerModuleType;
|
|
|
+ int mNetWorkErrorTime;
|
|
|
+ boolean isPrepared = false;
|
|
|
+ boolean isControllerShow = true;
|
|
|
+ private GestureDetector gestureDetector;
|
|
|
+ DeviceUtil deviceUtil;
|
|
|
+ IndicatorSeekBar mTouchSeek;
|
|
|
+ FrameLayout mTouchView;
|
|
|
+ TextView mTouchText;
|
|
|
+ ImageView mTouchIcon;
|
|
|
+ boolean isSaveState = false;
|
|
|
+ int oneVolume = 0;
|
|
|
+
|
|
|
+ public VideoPersenter(VideoAView view) {
|
|
|
+ mPersenter = this;
|
|
|
+ mView = view;
|
|
|
+ mModel = new VideoModel();
|
|
|
+ mGson = new Gson();
|
|
|
+ audiomanager = (AudioManager) mView.getActivity().getSystemService(Context.AUDIO_SERVICE);
|
|
|
+ maxVolume = audiomanager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 获取系统最大音量
|
|
|
+ currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值
|
|
|
+ oneVolume = maxVolume / 10;
|
|
|
+ deviceUtil = new DeviceUtil();
|
|
|
+ playerWidth = deviceUtil.getWidth(mView.getActivity());
|
|
|
+ gestureDetector = new GestureDetector(mView.getActivity(), this);
|
|
|
+ gestureDetector.setIsLongpressEnabled(true);
|
|
|
+ mFrameController = (FrameLayout) LayoutInflater.from(ContextUtil.getContext()).inflate(R.layout.player_controller, null);
|
|
|
+ mOtherFrame = mFrameController.findViewById(R.id.player_other_frame);
|
|
|
+ mPlayerController = mFrameController.findViewById(R.id.player_controller_layout);
|
|
|
+ mPlayerBack = mPlayerController.findViewById(R.id.player_back);
|
|
|
+ mVideoName = mFrameController.findViewById(R.id.player_name);
|
|
|
+ mLittleIcon = mFrameController.findViewById(R.id.player_little_icon);
|
|
|
+ mCurrent = mFrameController.findViewById(R.id.player_current);
|
|
|
+ mSeekbar = mFrameController.findViewById(R.id.player_seekbar);
|
|
|
+ Drawable drawable = DrawableUtil.getNewDrawable(mView.getActivity(), R.drawable.seekbar_thumb, 36 * 2, 60 * 2);
|
|
|
+ mSeekbar.setThumb(drawable);
|
|
|
+ mPlayerStatus = mFrameController.findViewById(R.id.player_status);
|
|
|
+ mPlayerLoading = mFrameController.findViewById(R.id.player_loading);
|
|
|
+ mLoadingAnim = (AnimationDrawable) mPlayerLoading.getBackground();
|
|
|
+ mLoadingAnim.start();
|
|
|
+ mSeekbar.setFocusable(true);
|
|
|
+ mStatusPlayBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.edufound_player_play);
|
|
|
+ mLittleIconPlayBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.player_little_icon_play);
|
|
|
+ mLittleIconPauseBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.player_little_icon_pause);
|
|
|
+ mTouchView = (FrameLayout) LayoutInflater.from(mView.getActivity()).inflate(R.layout.player_touch_view, null);
|
|
|
+ mTouchText = (TextView) mTouchView.findViewById(R.id.player_touch_text);
|
|
|
+ mTouchIcon = (ImageView) mTouchView.findViewById(R.id.player_touch_icon);
|
|
|
+ FrameLayout mTouchSeekFrame = (FrameLayout) mTouchView.findViewById(R.id.player_touch_seekbar_frame);
|
|
|
+ mTouchSeek = IndicatorSeekBar
|
|
|
+ .with(mView.getActivity())
|
|
|
+ .max(10)
|
|
|
+ .min(0)
|
|
|
+ .progress(0)
|
|
|
+ .tickCount(11)
|
|
|
+ .showTickMarksType(TickMarkType.DIVIDER)
|
|
|
+ .tickMarksColor(mView.getActivity().getResources().getColor(R.color.result_view))
|
|
|
+ .tickMarksSize(10)//dp
|
|
|
+ .tickMarksEndsHide(true)
|
|
|
+ .trackProgressColor(mView.getActivity().getResources().getColor(R.color.white))
|
|
|
+ .trackProgressSize(10)
|
|
|
+ .trackBackgroundColor(mView.getActivity().getResources().getColor(R.color.gray))
|
|
|
+ .trackBackgroundSize(10)
|
|
|
+ .thumbSize(0)
|
|
|
+ .build();
|
|
|
+ FrameLayout.LayoutParams touch_seek_params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
|
+ touch_seek_params.gravity = Gravity.CENTER;
|
|
|
+ mTouchSeek.setLayoutParams(touch_seek_params);
|
|
|
+ FrameLayout.LayoutParams touch_params = new FrameLayout.LayoutParams(deviceUtil.getWidth(mView.getActivity()) / 4, deviceUtil.getHeight(mView.getActivity()) / 3);
|
|
|
+ touch_params.gravity = Gravity.CENTER;
|
|
|
+ mTouchView.setLayoutParams(touch_params);
|
|
|
+ mTouchSeekFrame.addView(mTouchSeek);
|
|
|
+ mOtherFrame.addView(mTouchView);
|
|
|
+ mTouchView.setVisibility(View.GONE);
|
|
|
+ setListener();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setListener() {
|
|
|
+
|
|
|
+ mPlayerBack.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View v) {
|
|
|
+ removeHandler();
|
|
|
+ mView.activityFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ mLittleIcon.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View v) {
|
|
|
+ if (mView.isPlaying()) {
|
|
|
+ mView.pause();
|
|
|
+ checkStatus(STATUS_PLAY);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_STATUS_IMAGE);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ } else {
|
|
|
+ mView.start();
|
|
|
+ checkStatus(STATUS_PAUSE);
|
|
|
+ mPlayerStatus.setVisibility(View.INVISIBLE);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
|
+ @Override
|
|
|
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
|
+ mVideoHandler.removeMessages(SET_INFO);
|
|
|
+ mCurrent.setText(EduFoundUtil.getTime(progress) + "/" + EduFoundUtil.getTime(mView.getDuration()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onStartTrackingTouch(SeekBar seekBar) {
|
|
|
+ mVideoHandler.removeMessages(SHOW_CONTROLLER);
|
|
|
+ mVideoHandler.removeMessages(HIDE_CONTROLLER);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onStopTrackingTouch(SeekBar seekBar) {
|
|
|
+ if (seekBar.getProgress() >= mView.getDuration()) {
|
|
|
+ playerCompletion();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ mView.seek(seekBar.getProgress());
|
|
|
+ mCurrent.setText(EduFoundUtil.getTime(mView.getCurrent()) + "/" + EduFoundUtil.getTime(mView.getDuration()));
|
|
|
+ mVideoHandler.sendEmptyMessage(SET_INFO);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ mPlayerStatus.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View v) {
|
|
|
+ mView.start();
|
|
|
+ checkStatus(STATUS_PAUSE);
|
|
|
+ mPlayerStatus.setVisibility(View.INVISIBLE);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void loadData() {
|
|
|
+ mModel.LoadData(new BaseModel.LoadDataBack() {
|
|
|
+ @Override
|
|
|
+ public void success(String datajson) {
|
|
|
+ Logger.DebugE("datajson:" + datajson);
|
|
|
+ mView.showData(datajson);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failure() {
|
|
|
+ Logger.e("failure");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onDisConnNetWork() {
|
|
|
+// ToastUtil.showToast("播放器界面断网了...");
|
|
|
+ mView.stop();
|
|
|
+ mNetWorkErrorTime = mSeekbar.getProgress();
|
|
|
+ mVideoHandler.sendEmptyMessage(DISCONNECT_NETWORK);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onConnNetWork() {
|
|
|
+ mVideoHandler.removeMessages(DISCONNECT_NETWORK);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void loadVideo(Intent intent) {
|
|
|
+ try {
|
|
|
+ String play_jsons = intent.getStringExtra("play_jsons");
|
|
|
+ mPlayIndex = intent.getIntExtra("play_index", 0);
|
|
|
+ mPlayType = intent.getIntExtra("play_type", 0);
|
|
|
+ mPlayerModuleType = intent.getStringExtra("play_moduletype");
|
|
|
+ mVideoBean = mGson.fromJson(play_jsons, VideoJsonBean[].class);
|
|
|
+// mVideoBean = mGson.fromJson(video_json, VideoJsonBean.class);
|
|
|
+ mPlayingId = mVideoBean[mPlayIndex].videoid;
|
|
|
+ mPlayNeedPost = mVideoBean[mPlayIndex].videoneedpost;
|
|
|
+ mPlayStartTime = Integer.valueOf(mVideoBean[mPlayIndex].videoplaytime);
|
|
|
+ if (mVideoBean[mPlayIndex].videourl == null || mVideoBean[mPlayIndex].videourl.equals("") || mVideoBean[mPlayIndex].videourl.length() == 0) {
|
|
|
+ ToastUtil.showToast("URL是空的");
|
|
|
+ mView.activityFinish();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+// Logger.DebugE("mVideoBean[mPlayIndex].videourl:" + mVideoBean[mPlayIndex].videourl);
|
|
|
+ String decrypt = AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl);
|
|
|
+// Logger.DebugE("解密:" + decrypt);
|
|
|
+ if (mPlayType == TYPE_SINGLECYCLE_PLAY) {
|
|
|
+ SINGLECYCLE_URL = decrypt;
|
|
|
+ }
|
|
|
+// decrypt = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4";
|
|
|
+ if (decrypt == null || !decrypt.contains("http")) {
|
|
|
+ ToastUtil.showToast("视频格式出现问题");
|
|
|
+// mView.activityFinish();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ mView.setVideoUri(Uri.parse(decrypt));
|
|
|
+ mVideoName.setText(mVideoBean[mPlayIndex].videoname);
|
|
|
+ mVideoHandler.sendEmptyMessage(SET_INFO);
|
|
|
+ if (mPlayStartTime > 0) {
|
|
|
+ mView.seek(mPlayStartTime);
|
|
|
+ }
|
|
|
+ mView.start();
|
|
|
+ mVideoHandler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_TIME);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onKeyDown(int keycode, KeyEvent event) {
|
|
|
+ if (!isPrepared || (mView.getDuration() == 0) || mSeekbar.getMax() == 0) {
|
|
|
+ if (keycode == KeyEvent.KEYCODE_BACK || keycode == KeyEvent.KEYCODE_ESCAPE) {
|
|
|
+
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ switch (keycode) {
|
|
|
+ case KeyEvent.KEYCODE_BACK:
|
|
|
+ case KeyEvent.KEYCODE_ESCAPE:
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onKeyUp(int keycode, KeyEvent event) {
|
|
|
+ if (!isPrepared || (mView.getDuration() == 0) || mSeekbar.getMax() == 0) {
|
|
|
+ if (keycode == KeyEvent.KEYCODE_BACK || keycode == KeyEvent.KEYCODE_ESCAPE) {
|
|
|
+ mView.activityFinish();
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ switch (keycode) {
|
|
|
+ case KeyEvent.KEYCODE_BACK:
|
|
|
+ case KeyEvent.KEYCODE_ESCAPE:
|
|
|
+ removeHandler();
|
|
|
+ mView.activityFinish();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void removeHandler() {
|
|
|
+ mVideoHandler.removeMessages(SET_INFO);
|
|
|
+ mVideoHandler.removeMessages(SHOW_CONTROLLER);
|
|
|
+ mVideoHandler.removeMessages(HIDE_CONTROLLER);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public View getPlayerController() {
|
|
|
+ return mFrameController;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void showController() {
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void hideController() {
|
|
|
+ mVideoHandler.sendEmptyMessage(HIDE_CONTROLLER);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isShowController() {
|
|
|
+ return isControllerShow;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCompletion() {
|
|
|
+ playerCompletion();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onPrepared() {
|
|
|
+ mLoadingAnim.stop();
|
|
|
+ isPrepared = true;
|
|
|
+ mPlayerLoading.setVisibility(View.INVISIBLE);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onInfo(int what, int extra) {
|
|
|
+ switch (what) {
|
|
|
+ case MediaPlayer.MEDIA_INFO_BUFFERING_START:
|
|
|
+ mLoadingAnim.start();
|
|
|
+ mPlayerLoading.setVisibility(View.VISIBLE);
|
|
|
+
|
|
|
+ break;
|
|
|
+ case MediaPlayer.MEDIA_INFO_BUFFERING_END:
|
|
|
+ mLoadingAnim.stop();
|
|
|
+ mPlayerLoading.setVisibility(View.INVISIBLE);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onError(int what, int extra) {
|
|
|
+ switch (what) {
|
|
|
+ case -10000:
|
|
|
+ mVideoHandler.sendEmptyMessage(DISCONNECT_NETWORK);
|
|
|
+ ToastUtil.showToast("网络出现异常");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ mView.stop();
|
|
|
+ ToastUtil.showToast("视频异常--what:" + what + "--extra:" + extra);
|
|
|
+ mVideoHandler.postDelayed(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ mView.activityFinish();
|
|
|
+ }
|
|
|
+ }, 2000);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void destroy() {
|
|
|
+ NotificationWebPlayerTime();
|
|
|
+ if (mStatusPlayBitmap != null && !mStatusPlayBitmap.isRecycled()) {
|
|
|
+ // 回收并且置为null
|
|
|
+ mStatusPlayBitmap.recycle();
|
|
|
+ mLittleIconPauseBitmap.recycle();
|
|
|
+ mLittleIconPlayBitmap.recycle();
|
|
|
+ mStatusPlayBitmap = null;
|
|
|
+ mLittleIconPauseBitmap = null;
|
|
|
+ mLittleIconPlayBitmap = null;
|
|
|
+ }
|
|
|
+ System.gc();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onTouchEvent(MotionEvent event) {
|
|
|
+ if (event.getAction() == MotionEvent.ACTION_UP) {
|
|
|
+ GESTURE_FLAG = 0;// 手指离开屏幕后,重置调节音量或进度的标志
|
|
|
+ mVideoHandler.sendEmptyMessageDelayed(HIDE_TOUCHVIEW, 3000);
|
|
|
+ }
|
|
|
+ return gestureDetector.onTouchEvent(event);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onSaveInstanceState(Bundle outState) {
|
|
|
+ //保存
|
|
|
+// removeHandler();
|
|
|
+ mView.pause();
|
|
|
+ isSaveState = true;
|
|
|
+ Logger.e("onSaveInstanceState");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
|
+ //重新读取
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onResume() {
|
|
|
+ if (isSaveState && (mErrorViewDialog.isShowing() == false)) {
|
|
|
+ mView.start();
|
|
|
+ checkStatus(STATUS_PAUSE);
|
|
|
+ mPlayerStatus.setVisibility(View.INVISIBLE);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Handler mVideoHandler = new Handler(new Handler.Callback() {
|
|
|
+ @Override
|
|
|
+ public boolean handleMessage(Message msg) {
|
|
|
+ switch (msg.what) {
|
|
|
+ case SET_INFO:
|
|
|
+ mPlayerBackTime = mView.getCurrent();
|
|
|
+ mSeekbar.setProgress(mView.getCurrent());
|
|
|
+ mSeekbar.setMax(mView.getDuration());
|
|
|
+ mCurrent.setText(EduFoundUtil.getTime(mView.getCurrent()) + "/" + EduFoundUtil.getTime(mView.getDuration()));
|
|
|
+ mVideoHandler.sendEmptyMessageDelayed(SET_INFO, 1000);
|
|
|
+ break;
|
|
|
+ case SHOW_CONTROLLER:
|
|
|
+ isControllerShow = true;
|
|
|
+ mVideoHandler.removeMessages(HIDE_CONTROLLER);
|
|
|
+ mPlayerController.setVisibility(View.VISIBLE);
|
|
|
+ mVideoHandler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_TIME);
|
|
|
+ break;
|
|
|
+ case HIDE_CONTROLLER:
|
|
|
+ isControllerShow = false;
|
|
|
+ mPlayerController.setVisibility(View.INVISIBLE);
|
|
|
+ break;
|
|
|
+ case SHOW_STATUS_IMAGE:
|
|
|
+ mPlayerStatus.setVisibility(View.VISIBLE);
|
|
|
+ break;
|
|
|
+ case HIDE_STATUS_IMAGE:
|
|
|
+ mPlayerStatus.setVisibility(View.INVISIBLE);
|
|
|
+ break;
|
|
|
+ case PLAY_NEXT:
|
|
|
+ removeHandler();
|
|
|
+ mPlayIndex++;
|
|
|
+ if (mPlayIndex > mVideoBean.length - 1) {
|
|
|
+ mView.activityFinish();
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ ToastUtil.showToast("即将为您播放下一个:" + mVideoBean[mPlayIndex].videoname);
|
|
|
+ mVideoName.setText(mVideoBean[mPlayIndex].videoname);
|
|
|
+ mPlayingId = mVideoBean[mPlayIndex].videoid;
|
|
|
+ mPlayNeedPost = mVideoBean[mPlayIndex].videoneedpost;
|
|
|
+ mPlayStartTime = Integer.valueOf(mVideoBean[mPlayIndex].videoplaytime);
|
|
|
+ if (Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)) == null || Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)).equals("")) {
|
|
|
+ //可能是没权限,直接退出
|
|
|
+ mView.activityFinish();
|
|
|
+// return true;
|
|
|
+ } else {
|
|
|
+ mVideoHandler.sendEmptyMessage(SET_INFO);
|
|
|
+ mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_STATUS_IMAGE);
|
|
|
+ mVideoHandler.sendEmptyMessageDelayed(HIDE_STATUS_IMAGE, 500);
|
|
|
+ mView.start();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ mView.activityFinish();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DISCONNECT_NETWORK:
|
|
|
+ mVideoHandler.post(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ showDisConnNeWorkWindow();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ break;
|
|
|
+ case CONNECT_NETWORK:
|
|
|
+ try {
|
|
|
+ if (mErrorViewDialog != null) {
|
|
|
+ mErrorViewDialog.dismiss();
|
|
|
+ }
|
|
|
+ mView.stop();
|
|
|
+ mView.releaseVideo();
|
|
|
+ mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
|
|
|
+ mErrorViewDialog.dismiss();
|
|
|
+ mView.seek(mNetWorkErrorTime);
|
|
|
+ mView.start();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case SHOW_TOUCHVIEW:
|
|
|
+ mTouchView.setVisibility(View.VISIBLE);
|
|
|
+ break;
|
|
|
+ case HIDE_TOUCHVIEW:
|
|
|
+ mTouchView.setVisibility(View.GONE);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 切换status图片
|
|
|
+ * */
|
|
|
+ void checkStatus(final int status) {
|
|
|
+ mLittleIcon.post(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ switch (status) {
|
|
|
+ case STATUS_PLAY:
|
|
|
+ if (mStatusCode != STATUS_PLAY) {
|
|
|
+ mStatusCode = STATUS_PLAY;
|
|
|
+ mPlayerStatus.setImageBitmap(mStatusPlayBitmap);
|
|
|
+ mLittleIcon.setImageBitmap(mLittleIconPlayBitmap);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STATUS_PAUSE:
|
|
|
+ if (mStatusCode != STATUS_PAUSE) {
|
|
|
+ mStatusCode = STATUS_PAUSE;
|
|
|
+ mLittleIcon.setImageBitmap(mLittleIconPauseBitmap);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STATUS_FORWARD:
|
|
|
+ if (mStatusCode != STATUS_FORWARD) {
|
|
|
+ mStatusCode = STATUS_FORWARD;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STATUS_REWIND:
|
|
|
+ if (mStatusCode != STATUS_REWIND) {
|
|
|
+ mStatusCode = STATUS_REWIND;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void showDisConnNeWorkWindow() {
|
|
|
+ if (mErrorView == null) {
|
|
|
+ mErrorViewDialog = new Dialog(mView.getActivity());
|
|
|
+ try {
|
|
|
+ int dividerID = mView.getActivity().getResources().getIdentifier("android:id/titleDivider", null, null);
|
|
|
+ View divider = mErrorViewDialog.findViewById(dividerID);
|
|
|
+ divider.setBackgroundColor(Color.TRANSPARENT);
|
|
|
+ } catch (Exception e) {
|
|
|
+ //上面的代码,是用来去除Holo主题的蓝色线条
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ mErrorView = new ErrorView(mView);
|
|
|
+ mErrorView.setBtnClickListener(new ErrorView.BtnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void clickRelase() {
|
|
|
+// mView.start();
|
|
|
+ try {
|
|
|
+ if (ContextUtil.getNetWorkState()) {
|
|
|
+ mView.stop();
|
|
|
+ mView.releaseVideo();
|
|
|
+ mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
|
|
|
+ mErrorViewDialog.dismiss();
|
|
|
+ mView.seek(mNetWorkErrorTime);
|
|
|
+ mView.start();
|
|
|
+ } else {
|
|
|
+ ToastUtil.showToast("请检查网络连接状况");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void clickExit() {
|
|
|
+ mErrorViewDialog.dismiss();
|
|
|
+ EApplication.clearActivity();
|
|
|
+ Intent intent_restart = new Intent(ContextUtil.CLOSE_ACTIVITY_MAIN);
|
|
|
+ mView.getActivity().sendBroadcast(intent_restart);
|
|
|
+ System.exit(0);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ mErrorViewDialog.setCancelable(false);
|
|
|
+ mErrorViewDialog.setContentView(mErrorView);
|
|
|
+ Window dialogWindow = mErrorViewDialog.getWindow();
|
|
|
+ dialogWindow.setGravity(Gravity.CENTER);
|
|
|
+ dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
|
|
|
+ dialogWindow.getDecorView().setBackgroundColor(Color.parseColor("#80000000"));
|
|
|
+ WindowManager m = mView.getActivity().getWindowManager();
|
|
|
+ Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
|
|
|
+ WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
|
|
|
+ p.height = (int) (d.getHeight() * 1);
|
|
|
+ p.width = WindowManager.LayoutParams.MATCH_PARENT;
|
|
|
+ p.horizontalMargin = 0;
|
|
|
+ dialogWindow.setAttributes(p);
|
|
|
+ }
|
|
|
+ if (!mErrorViewDialog.isShowing()) {
|
|
|
+ mErrorViewDialog.show();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ void playerCompletion() {
|
|
|
+ mPlayerBackTime = 0;
|
|
|
+ switch (mPlayType) {
|
|
|
+ case TYPE_SEPARATELY_PLAY:
|
|
|
+ ToastUtil.showToast("播放完成");
|
|
|
+ removeHandler();
|
|
|
+ mView.activityFinish();
|
|
|
+ break;
|
|
|
+ case TYPE_SINGLECYCLE_PLAY:
|
|
|
+ ToastUtil.showToast("重新播放");
|
|
|
+ removeHandler();
|
|
|
+ mVideoHandler.sendEmptyMessage(SET_INFO);
|
|
|
+ mView.seek(0);
|
|
|
+ mView.start();
|
|
|
+ return;
|
|
|
+ case TYPE_LIST_PLAY:
|
|
|
+ NotificationWebPlayerTime();
|
|
|
+ mVideoHandler.sendEmptyMessage(PLAY_NEXT);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void NotificationWebPlayerTime() {
|
|
|
+ Intent intent = new Intent(ContextUtil.NOTIFICATION_WEB_PLAYERTIME);
|
|
|
+ intent.putExtra("over_time", String.valueOf(mPlayerBackTime));
|
|
|
+ intent.putExtra("over_id", String.valueOf(mPlayingId));
|
|
|
+ intent.putExtra("over_neetpost", mPlayNeedPost);
|
|
|
+ intent.putExtra("over_moduletype", mPlayerModuleType);
|
|
|
+ mView.getActivity().sendBroadcast(intent);
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean firstScroll = false;
|
|
|
+ private int GESTURE_FLAG = 0;// 1,调节进度,2,调节音量,3.调节亮度
|
|
|
+ private static final int GESTURE_MODIFY_PROGRESS = 1;
|
|
|
+ private static final int GESTURE_MODIFY_VOLUME = 2;
|
|
|
+ private static final int GESTURE_MODIFY_BRIGHT = 3;
|
|
|
+ private int playerWidth;
|
|
|
+ private int maxVolume, currentVolume;
|
|
|
+ private AudioManager audiomanager;
|
|
|
+ private float mBrightness = -1f; // 亮度
|
|
|
+ private static final float STEP_PROGRESS = 3f;// 设定进度滑动时的步长,避免每次滑动都改变,导致改变过快
|
|
|
+ private static final float STEP_VOLUME = 3f;// 协调音量滑动时的步长,避免每次滑动都改变,导致改变过快
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onDown(MotionEvent e) {
|
|
|
+ firstScroll = true;// 设定是触摸屏幕后第一次scroll的标志
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onShowPress(MotionEvent e) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onSingleTapUp(MotionEvent e) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ mVideoHandler.removeMessages(HIDE_TOUCHVIEW);
|
|
|
+ float mOldX = e1.getX(), mOldY = e1.getY();
|
|
|
+ int y = (int) e2.getRawY();
|
|
|
+ if (firstScroll) {// 以触摸屏幕后第一次滑动为标准,避免在屏幕上操作切换混乱
|
|
|
+ // 横向的距离变化大则调整进度,纵向的变化大则调整音量
|
|
|
+ if (Math.abs(distanceX) >= Math.abs(distanceY)) {
|
|
|
+ GESTURE_FLAG = GESTURE_MODIFY_PROGRESS;
|
|
|
+ } else {
|
|
|
+ if (mOldX > playerWidth / 2.0f) {// 音量
|
|
|
+ GESTURE_FLAG = GESTURE_MODIFY_VOLUME;
|
|
|
+ } else if (mOldX < playerWidth / 2.0f) {// 亮度
|
|
|
+ GESTURE_FLAG = GESTURE_MODIFY_BRIGHT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果每次触摸屏幕后第一次scroll是调节进度,那之后的scroll事件都处理音量进度,直到离开屏幕执行下一次操作
|
|
|
+ if (GESTURE_FLAG == GESTURE_MODIFY_PROGRESS) {
|
|
|
+
|
|
|
+ }
|
|
|
+ // 如果每次触摸屏幕后第一次scroll是调节音量,那之后的scroll事件都处理音量调节,直到离开屏幕执行下一次操作
|
|
|
+ else if (GESTURE_FLAG == GESTURE_MODIFY_VOLUME) {
|
|
|
+ currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值
|
|
|
+ mTouchSeek.setProgress(currentVolume);
|
|
|
+ if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动
|
|
|
+ if (distanceY >= dip2px(STEP_VOLUME)) {// 音量调大,注意横屏时的坐标体系,尽管左上角是原点,但横向向上滑动时distanceY为正
|
|
|
+ if (currentVolume < maxVolume) {// 为避免调节过快,distanceY应大于一个设定值
|
|
|
+ currentVolume = currentVolume + oneVolume;
|
|
|
+ }
|
|
|
+// gesture_iv_player_volume.setImageResource(R.drawable.souhu_player_volume);
|
|
|
+ } else if (distanceY <= -dip2px(STEP_VOLUME)) {// 音量调小
|
|
|
+ if (currentVolume > 0) {
|
|
|
+ currentVolume = currentVolume - oneVolume;
|
|
|
+ if (currentVolume == 0) {// 静音,设定静音独有的图片
|
|
|
+// gesture_iv_player_volume
|
|
|
+// .setImageResource(R.drawable.souhu_player_silence);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// geture_tv_volume_percentage.setText(percentage + "%");
|
|
|
+ mTouchText.setText("音量");
|
|
|
+ mTouchIcon.setImageBitmap(BitmapFactory.decodeResource(mView.getActivity().getResources(), R.drawable.player_volume_icon));
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_TOUCHVIEW);
|
|
|
+ mTouchSeek.setProgress((currentVolume));
|
|
|
+ audiomanager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果每次触摸屏幕后第一次scroll是调节亮度,那之后的scroll事件都处理亮度调节,直到离开屏幕执行下一次操作
|
|
|
+ else if (GESTURE_FLAG == GESTURE_MODIFY_BRIGHT) {
|
|
|
+ Logger.e("亮度....");
|
|
|
+ WindowManager.LayoutParams lpa = mView.getActivity().getWindow().getAttributes();
|
|
|
+// gesture_iv_player_bright.setImageResource(R.drawable.souhu_player_bright);
|
|
|
+ mTouchSeek.setProgress(lpa.screenBrightness);
|
|
|
+ if (mBrightness < 0) {
|
|
|
+ mBrightness = mView.getActivity().getWindow().getAttributes().screenBrightness;
|
|
|
+ if (mBrightness <= 0.00f)
|
|
|
+ mBrightness = 0.00f;
|
|
|
+ }
|
|
|
+ if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动
|
|
|
+ if (distanceY >= dip2px(STEP_VOLUME)) {
|
|
|
+ if (mBrightness < 1.0f) {// 为避免调节过快,distanceY应大于一个设定值
|
|
|
+ mBrightness += 0.1f;
|
|
|
+ }
|
|
|
+ } else if (distanceY <= -dip2px(STEP_VOLUME)) {
|
|
|
+ if (mBrightness > 0) {
|
|
|
+ mBrightness -= 0.1f;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (mBrightness > 1.0f) {
|
|
|
+ mBrightness = 1.0f;
|
|
|
+ } else if (mBrightness < 0.01f) {
|
|
|
+ mBrightness = 0.01f;
|
|
|
+ }
|
|
|
+ lpa.screenBrightness = mBrightness;
|
|
|
+ mTouchText.setText("亮度");
|
|
|
+ mTouchIcon.setImageBitmap(BitmapFactory.decodeResource(mView.getActivity().getResources(), R.drawable.player_brightness_icon));
|
|
|
+ mVideoHandler.sendEmptyMessage(SHOW_TOUCHVIEW);
|
|
|
+ mTouchSeek.setProgress((mBrightness * 10));
|
|
|
+ mView.getActivity().getWindow().setAttributes(lpa);
|
|
|
+// geture_tv_bright_percentage.setText((int) (lpa.screenBrightness * 100) + "%");
|
|
|
+ }
|
|
|
+
|
|
|
+ firstScroll = false;// 第一次scroll执行完成,修改标志
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int dip2px(float dpValue) {
|
|
|
+ final float scale = mView.getActivity().getResources().getDisplayMetrics().density;
|
|
|
+ return (int) (dpValue * scale + 0.5f);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onLongPress(MotionEvent e) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onSingleTapConfirmed(MotionEvent e) {
|
|
|
+ Logger.e("onSingleTapConfirmed");
|
|
|
+ if (mPersenter.isShowController()) {
|
|
|
+ mPersenter.hideController();
|
|
|
+ } else {
|
|
|
+ mPersenter.showController();
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onDoubleTap(MotionEvent e) {
|
|
|
+ Logger.e("onDoubleTap");
|
|
|
+ if (mView.isPlaying()) {
|
|
|
+ mView.pause();
|
|
|
+ mPersenter.checkStatus(mPersenter.STATUS_PLAY);
|
|
|
+ mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_STATUS_IMAGE);
|
|
|
+ mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_CONTROLLER);
|
|
|
+ } else {
|
|
|
+ mView.start();
|
|
|
+ mPersenter.checkStatus(mPersenter.STATUS_PAUSE);
|
|
|
+ mPersenter.mPlayerStatus.setVisibility(View.INVISIBLE);
|
|
|
+ mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_CONTROLLER);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onDoubleTapEvent(MotionEvent e) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+interface VideoIPersenter extends BasePersenter {
|
|
|
+ void loadVideo(Intent intent);
|
|
|
+
|
|
|
+ boolean onKeyDown(int keycode, KeyEvent event);
|
|
|
+
|
|
|
+ boolean onKeyUp(int keycode, KeyEvent event);
|
|
|
+
|
|
|
+ void removeHandler();
|
|
|
+
|
|
|
+ View getPlayerController();
|
|
|
+
|
|
|
+ void showController();
|
|
|
+
|
|
|
+ void hideController();
|
|
|
+
|
|
|
+ boolean isShowController();
|
|
|
+
|
|
|
+ void onCompletion();
|
|
|
+
|
|
|
+ void onPrepared();
|
|
|
+
|
|
|
+ void onInfo(int what, int extra);
|
|
|
+
|
|
|
+ boolean onError(int what, int extra);
|
|
|
+
|
|
|
+ void destroy();
|
|
|
+
|
|
|
+ boolean onTouchEvent(MotionEvent event);
|
|
|
+
|
|
|
+ void onSaveInstanceState(Bundle outState);
|
|
|
+
|
|
|
+ void onRestoreInstanceState(Bundle savedInstanceState);
|
|
|
+
|
|
|
+ void onResume();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+class VideoJsonBean {
|
|
|
+ public String videourl;
|
|
|
+ public String videoname;
|
|
|
+ public String videoid;
|
|
|
+ public String videoplaytime;
|
|
|
+ public String videoneedpost;
|
|
|
+}
|