VideoPersenter.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. package com.edufound.mobile.video;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7. import android.graphics.Color;
  8. import android.graphics.drawable.AnimationDrawable;
  9. import android.graphics.drawable.Drawable;
  10. import android.media.AudioManager;
  11. import android.media.MediaPlayer;
  12. import android.net.Uri;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.view.Display;
  17. import android.view.GestureDetector;
  18. import android.view.Gravity;
  19. import android.view.KeyEvent;
  20. import android.view.LayoutInflater;
  21. import android.view.MotionEvent;
  22. import android.view.View;
  23. import android.view.ViewGroup;
  24. import android.view.Window;
  25. import android.view.WindowManager;
  26. import android.widget.FrameLayout;
  27. import android.widget.ImageView;
  28. import android.widget.LinearLayout;
  29. import android.widget.SeekBar;
  30. import android.widget.TextView;
  31. import com.edufound.mobile.R;
  32. import com.edufound.mobile.application.EApplication;
  33. import com.edufound.mobile.base.BaseModel;
  34. import com.edufound.mobile.base.BasePersenter;
  35. import com.edufound.mobile.util.AesUtil;
  36. import com.edufound.mobile.util.ContextUtil;
  37. import com.edufound.mobile.util.DeviceUtil;
  38. import com.edufound.mobile.util.DrawableUtil;
  39. import com.edufound.mobile.util.EduFoundUtil;
  40. import com.edufound.mobile.util.Logger;
  41. import com.edufound.mobile.util.ToastUtil;
  42. import com.edufound.mobile.view.ErrorView;
  43. import com.google.gson.Gson;
  44. import com.warkiz.widget.IndicatorSeekBar;
  45. import com.warkiz.widget.TickMarkType;
  46. public class VideoPersenter implements VideoIPersenter, GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
  47. private VideoPersenter mPersenter;
  48. private VideoAView mView = null;
  49. private VideoModel mModel = null;
  50. private FrameLayout mFrameController;
  51. private LinearLayout mPlayerController;
  52. private FrameLayout mOtherFrame;
  53. private ImageView mPlayerBack;
  54. private ImageView mPlayerLoading;
  55. public ImageView mPlayerStatus;
  56. private Gson mGson;
  57. private VideoJsonBean[] mVideoBean;
  58. private TextView mVideoName;
  59. private ImageView mLittleIcon;
  60. private TextView mCurrent;
  61. private SeekBar mSeekbar;
  62. private int SEEK_COUNT = 1; //用来控制长按快进的seek_progress
  63. final int SEEK_PROGRESS = 1000;
  64. final int HIDE_CONTROLLER_TIME = 5000;
  65. final int SET_INFO = 0x7891;
  66. final int SHOW_CONTROLLER = 0x7892;
  67. final int HIDE_CONTROLLER = 0x7893;
  68. final int STATUS_PLAY = 0x8891;
  69. final int STATUS_PAUSE = 0x8892;
  70. final int STATUS_FORWARD = 0x8893;
  71. final int STATUS_REWIND = 0x8894;
  72. final int SHOW_STATUS_IMAGE = 0x8895;
  73. final int HIDE_STATUS_IMAGE = 0x8896;
  74. final int PLAY_NEXT = 0x8897;
  75. final int DISCONNECT_NETWORK = 0x8898;
  76. final int CONNECT_NETWORK = 0x9989;
  77. final int SHOW_TOUCHVIEW = 0x8899;
  78. final int HIDE_TOUCHVIEW = 0x8890;
  79. //单独播放,播放完成直接关闭
  80. final int TYPE_SEPARATELY_PLAY = 0;
  81. //单独循环播放,一直循环
  82. final int TYPE_SINGLECYCLE_PLAY = 1;
  83. //列表播放,播放完列表关闭
  84. final int TYPE_LIST_PLAY = 2;
  85. AnimationDrawable mLoadingAnim;
  86. private int mStatusCode;
  87. Bitmap mStatusPlayBitmap;
  88. Bitmap mLittleIconPlayBitmap;
  89. Bitmap mLittleIconPauseBitmap;
  90. int mPlayIndex;
  91. int mPlayType;
  92. String mPlayingId;
  93. String mPlayNeedPost;
  94. int mPlayStartTime;
  95. String SINGLECYCLE_URL = "";
  96. ErrorView mErrorView;
  97. Dialog mErrorViewDialog;
  98. int mPlayerBackTime;
  99. String mPlayerModuleType;
  100. int mNetWorkErrorTime;
  101. boolean isPrepared = false;
  102. boolean isControllerShow = true;
  103. private GestureDetector gestureDetector;
  104. DeviceUtil deviceUtil;
  105. IndicatorSeekBar mTouchSeek;
  106. FrameLayout mTouchView;
  107. TextView mTouchText;
  108. ImageView mTouchIcon;
  109. boolean isSaveState = false;
  110. int oneVolume = 0;
  111. public VideoPersenter(VideoAView view) {
  112. mPersenter = this;
  113. mView = view;
  114. mModel = new VideoModel();
  115. mGson = new Gson();
  116. audiomanager = (AudioManager) mView.getActivity().getSystemService(Context.AUDIO_SERVICE);
  117. maxVolume = audiomanager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 获取系统最大音量
  118. currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值
  119. oneVolume = maxVolume / 10;
  120. deviceUtil = new DeviceUtil();
  121. playerWidth = deviceUtil.getWidth(mView.getActivity());
  122. gestureDetector = new GestureDetector(mView.getActivity(), this);
  123. gestureDetector.setIsLongpressEnabled(true);
  124. mFrameController = (FrameLayout) LayoutInflater.from(ContextUtil.getContext()).inflate(R.layout.player_controller, null);
  125. mOtherFrame = mFrameController.findViewById(R.id.player_other_frame);
  126. mPlayerController = mFrameController.findViewById(R.id.player_controller_layout);
  127. mPlayerBack = mPlayerController.findViewById(R.id.player_back);
  128. mVideoName = mFrameController.findViewById(R.id.player_name);
  129. mLittleIcon = mFrameController.findViewById(R.id.player_little_icon);
  130. mCurrent = mFrameController.findViewById(R.id.player_current);
  131. mSeekbar = mFrameController.findViewById(R.id.player_seekbar);
  132. Drawable drawable = DrawableUtil.getNewDrawable(mView.getActivity(), R.drawable.seekbar_thumb, 36 * 2, 60 * 2);
  133. mSeekbar.setThumb(drawable);
  134. mPlayerStatus = mFrameController.findViewById(R.id.player_status);
  135. mPlayerLoading = mFrameController.findViewById(R.id.player_loading);
  136. mLoadingAnim = (AnimationDrawable) mPlayerLoading.getBackground();
  137. mLoadingAnim.start();
  138. mSeekbar.setFocusable(true);
  139. mStatusPlayBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.edufound_player_play);
  140. mLittleIconPlayBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.player_little_icon_play);
  141. mLittleIconPauseBitmap = BitmapFactory.decodeResource(ContextUtil.getContext().getResources(), R.drawable.player_little_icon_pause);
  142. mTouchView = (FrameLayout) LayoutInflater.from(mView.getActivity()).inflate(R.layout.player_touch_view, null);
  143. mTouchText = (TextView) mTouchView.findViewById(R.id.player_touch_text);
  144. mTouchIcon = (ImageView) mTouchView.findViewById(R.id.player_touch_icon);
  145. FrameLayout mTouchSeekFrame = (FrameLayout) mTouchView.findViewById(R.id.player_touch_seekbar_frame);
  146. mTouchSeek = IndicatorSeekBar
  147. .with(mView.getActivity())
  148. .max(10)
  149. .min(0)
  150. .progress(0)
  151. .tickCount(11)
  152. .showTickMarksType(TickMarkType.DIVIDER)
  153. .tickMarksColor(mView.getActivity().getResources().getColor(R.color.result_view))
  154. .tickMarksSize(10)//dp
  155. .tickMarksEndsHide(true)
  156. .trackProgressColor(mView.getActivity().getResources().getColor(R.color.white))
  157. .trackProgressSize(10)
  158. .trackBackgroundColor(mView.getActivity().getResources().getColor(R.color.gray))
  159. .trackBackgroundSize(10)
  160. .thumbSize(0)
  161. .build();
  162. FrameLayout.LayoutParams touch_seek_params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  163. touch_seek_params.gravity = Gravity.CENTER;
  164. mTouchSeek.setLayoutParams(touch_seek_params);
  165. FrameLayout.LayoutParams touch_params = new FrameLayout.LayoutParams(deviceUtil.getWidth(mView.getActivity()) / 4, deviceUtil.getHeight(mView.getActivity()) / 3);
  166. touch_params.gravity = Gravity.CENTER;
  167. mTouchView.setLayoutParams(touch_params);
  168. mTouchSeekFrame.addView(mTouchSeek);
  169. mOtherFrame.addView(mTouchView);
  170. mTouchView.setVisibility(View.GONE);
  171. setListener();
  172. }
  173. void setListener() {
  174. mPlayerBack.setOnClickListener(new View.OnClickListener() {
  175. @Override
  176. public void onClick(View v) {
  177. removeHandler();
  178. mView.activityFinish();
  179. }
  180. });
  181. mLittleIcon.setOnClickListener(new View.OnClickListener() {
  182. @Override
  183. public void onClick(View v) {
  184. if (mView.isPlaying()) {
  185. mView.pause();
  186. checkStatus(STATUS_PLAY);
  187. mVideoHandler.sendEmptyMessage(SHOW_STATUS_IMAGE);
  188. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  189. } else {
  190. mView.start();
  191. checkStatus(STATUS_PAUSE);
  192. mPlayerStatus.setVisibility(View.INVISIBLE);
  193. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  194. }
  195. }
  196. });
  197. mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  198. @Override
  199. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  200. mVideoHandler.removeMessages(SET_INFO);
  201. mCurrent.setText(EduFoundUtil.getTime(progress) + "/" + EduFoundUtil.getTime(mView.getDuration()));
  202. }
  203. @Override
  204. public void onStartTrackingTouch(SeekBar seekBar) {
  205. mVideoHandler.removeMessages(SHOW_CONTROLLER);
  206. mVideoHandler.removeMessages(HIDE_CONTROLLER);
  207. }
  208. @Override
  209. public void onStopTrackingTouch(SeekBar seekBar) {
  210. if (seekBar.getProgress() >= mView.getDuration()) {
  211. playerCompletion();
  212. return;
  213. }
  214. mView.seek(seekBar.getProgress());
  215. mCurrent.setText(EduFoundUtil.getTime(mView.getCurrent()) + "/" + EduFoundUtil.getTime(mView.getDuration()));
  216. mVideoHandler.sendEmptyMessage(SET_INFO);
  217. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  218. }
  219. });
  220. mPlayerStatus.setOnClickListener(new View.OnClickListener() {
  221. @Override
  222. public void onClick(View v) {
  223. mView.start();
  224. checkStatus(STATUS_PAUSE);
  225. mPlayerStatus.setVisibility(View.INVISIBLE);
  226. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  227. }
  228. });
  229. }
  230. @Override
  231. public void loadData() {
  232. mModel.LoadData(new BaseModel.LoadDataBack() {
  233. @Override
  234. public void success(String datajson) {
  235. Logger.DebugE("datajson:" + datajson);
  236. mView.showData(datajson);
  237. }
  238. @Override
  239. public void failure() {
  240. Logger.e("failure");
  241. }
  242. });
  243. }
  244. @Override
  245. public void onDisConnNetWork() {
  246. // ToastUtil.showToast("播放器界面断网了...");
  247. mView.stop();
  248. mNetWorkErrorTime = mSeekbar.getProgress();
  249. mVideoHandler.sendEmptyMessage(DISCONNECT_NETWORK);
  250. }
  251. @Override
  252. public void onConnNetWork() {
  253. mVideoHandler.removeMessages(DISCONNECT_NETWORK);
  254. }
  255. @Override
  256. public void loadVideo(Intent intent) {
  257. try {
  258. String play_jsons = intent.getStringExtra("play_jsons");
  259. mPlayIndex = intent.getIntExtra("play_index", 0);
  260. mPlayType = intent.getIntExtra("play_type", 0);
  261. mPlayerModuleType = intent.getStringExtra("play_moduletype");
  262. mVideoBean = mGson.fromJson(play_jsons, VideoJsonBean[].class);
  263. // mVideoBean = mGson.fromJson(video_json, VideoJsonBean.class);
  264. mPlayingId = mVideoBean[mPlayIndex].videoid;
  265. mPlayNeedPost = mVideoBean[mPlayIndex].videoneedpost;
  266. mPlayStartTime = Integer.valueOf(mVideoBean[mPlayIndex].videoplaytime);
  267. if (mVideoBean[mPlayIndex].videourl == null || mVideoBean[mPlayIndex].videourl.equals("") || mVideoBean[mPlayIndex].videourl.length() == 0) {
  268. ToastUtil.showToast("URL是空的");
  269. mView.activityFinish();
  270. return;
  271. }
  272. // Logger.DebugE("mVideoBean[mPlayIndex].videourl:" + mVideoBean[mPlayIndex].videourl);
  273. String decrypt = AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl);
  274. // Logger.DebugE("解密:" + decrypt);
  275. if (mPlayType == TYPE_SINGLECYCLE_PLAY) {
  276. SINGLECYCLE_URL = decrypt;
  277. }
  278. // decrypt = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4";
  279. if (decrypt == null || !decrypt.contains("http")) {
  280. ToastUtil.showToast("视频格式出现问题");
  281. // mView.activityFinish();
  282. return;
  283. }
  284. mView.setVideoUri(Uri.parse(decrypt));
  285. mVideoName.setText(mVideoBean[mPlayIndex].videoname);
  286. mVideoHandler.sendEmptyMessage(SET_INFO);
  287. if (mPlayStartTime > 0) {
  288. mView.seek(mPlayStartTime);
  289. }
  290. mView.start();
  291. mVideoHandler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_TIME);
  292. } catch (Exception e) {
  293. e.printStackTrace();
  294. }
  295. }
  296. @Override
  297. public boolean onKeyDown(int keycode, KeyEvent event) {
  298. if (!isPrepared || (mView.getDuration() == 0) || mSeekbar.getMax() == 0) {
  299. if (keycode == KeyEvent.KEYCODE_BACK || keycode == KeyEvent.KEYCODE_ESCAPE) {
  300. }
  301. return true;
  302. }
  303. switch (keycode) {
  304. case KeyEvent.KEYCODE_BACK:
  305. case KeyEvent.KEYCODE_ESCAPE:
  306. return true;
  307. }
  308. return false;
  309. }
  310. @Override
  311. public boolean onKeyUp(int keycode, KeyEvent event) {
  312. if (!isPrepared || (mView.getDuration() == 0) || mSeekbar.getMax() == 0) {
  313. if (keycode == KeyEvent.KEYCODE_BACK || keycode == KeyEvent.KEYCODE_ESCAPE) {
  314. mView.activityFinish();
  315. }
  316. return true;
  317. }
  318. switch (keycode) {
  319. case KeyEvent.KEYCODE_BACK:
  320. case KeyEvent.KEYCODE_ESCAPE:
  321. removeHandler();
  322. mView.activityFinish();
  323. return true;
  324. }
  325. return false;
  326. }
  327. @Override
  328. public void removeHandler() {
  329. mVideoHandler.removeMessages(SET_INFO);
  330. mVideoHandler.removeMessages(SHOW_CONTROLLER);
  331. mVideoHandler.removeMessages(HIDE_CONTROLLER);
  332. }
  333. @Override
  334. public View getPlayerController() {
  335. return mFrameController;
  336. }
  337. @Override
  338. public void showController() {
  339. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  340. }
  341. @Override
  342. public void hideController() {
  343. mVideoHandler.sendEmptyMessage(HIDE_CONTROLLER);
  344. }
  345. @Override
  346. public boolean isShowController() {
  347. return isControllerShow;
  348. }
  349. @Override
  350. public void onCompletion() {
  351. playerCompletion();
  352. }
  353. @Override
  354. public void onPrepared() {
  355. mLoadingAnim.stop();
  356. isPrepared = true;
  357. mPlayerLoading.setVisibility(View.INVISIBLE);
  358. }
  359. @Override
  360. public void onInfo(int what, int extra) {
  361. switch (what) {
  362. case MediaPlayer.MEDIA_INFO_BUFFERING_START:
  363. mLoadingAnim.start();
  364. mPlayerLoading.setVisibility(View.VISIBLE);
  365. break;
  366. case MediaPlayer.MEDIA_INFO_BUFFERING_END:
  367. mLoadingAnim.stop();
  368. mPlayerLoading.setVisibility(View.INVISIBLE);
  369. break;
  370. }
  371. }
  372. @Override
  373. public boolean onError(int what, int extra) {
  374. switch (what) {
  375. case -10000:
  376. mVideoHandler.sendEmptyMessage(DISCONNECT_NETWORK);
  377. ToastUtil.showToast("网络出现异常");
  378. break;
  379. default:
  380. mView.stop();
  381. ToastUtil.showToast("视频异常--what:" + what + "--extra:" + extra);
  382. mVideoHandler.postDelayed(new Runnable() {
  383. @Override
  384. public void run() {
  385. mView.activityFinish();
  386. }
  387. }, 2000);
  388. break;
  389. }
  390. return true;
  391. }
  392. @Override
  393. public void destroy() {
  394. NotificationWebPlayerTime();
  395. if (mStatusPlayBitmap != null && !mStatusPlayBitmap.isRecycled()) {
  396. // 回收并且置为null
  397. mStatusPlayBitmap.recycle();
  398. mLittleIconPauseBitmap.recycle();
  399. mLittleIconPlayBitmap.recycle();
  400. mStatusPlayBitmap = null;
  401. mLittleIconPauseBitmap = null;
  402. mLittleIconPlayBitmap = null;
  403. }
  404. System.gc();
  405. }
  406. @Override
  407. public boolean onTouchEvent(MotionEvent event) {
  408. if (event.getAction() == MotionEvent.ACTION_UP) {
  409. GESTURE_FLAG = 0;// 手指离开屏幕后,重置调节音量或进度的标志
  410. mVideoHandler.sendEmptyMessageDelayed(HIDE_TOUCHVIEW, 3000);
  411. }
  412. return gestureDetector.onTouchEvent(event);
  413. }
  414. @Override
  415. public void onSaveInstanceState(Bundle outState) {
  416. //保存
  417. // removeHandler();
  418. mView.pause();
  419. isSaveState = true;
  420. Logger.e("onSaveInstanceState");
  421. }
  422. @Override
  423. public void onRestoreInstanceState(Bundle savedInstanceState) {
  424. //重新读取
  425. }
  426. @Override
  427. public void onResume() {
  428. if (isSaveState && (mErrorViewDialog.isShowing() == false)) {
  429. mView.start();
  430. checkStatus(STATUS_PAUSE);
  431. mPlayerStatus.setVisibility(View.INVISIBLE);
  432. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  433. }
  434. }
  435. Handler mVideoHandler = new Handler(new Handler.Callback() {
  436. @Override
  437. public boolean handleMessage(Message msg) {
  438. switch (msg.what) {
  439. case SET_INFO:
  440. mPlayerBackTime = mView.getCurrent();
  441. mSeekbar.setProgress(mView.getCurrent());
  442. mSeekbar.setMax(mView.getDuration());
  443. mCurrent.setText(EduFoundUtil.getTime(mView.getCurrent()) + "/" + EduFoundUtil.getTime(mView.getDuration()));
  444. mVideoHandler.sendEmptyMessageDelayed(SET_INFO, 1000);
  445. break;
  446. case SHOW_CONTROLLER:
  447. isControllerShow = true;
  448. mVideoHandler.removeMessages(HIDE_CONTROLLER);
  449. mPlayerController.setVisibility(View.VISIBLE);
  450. mVideoHandler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_TIME);
  451. break;
  452. case HIDE_CONTROLLER:
  453. isControllerShow = false;
  454. mPlayerController.setVisibility(View.INVISIBLE);
  455. break;
  456. case SHOW_STATUS_IMAGE:
  457. mPlayerStatus.setVisibility(View.VISIBLE);
  458. break;
  459. case HIDE_STATUS_IMAGE:
  460. mPlayerStatus.setVisibility(View.INVISIBLE);
  461. break;
  462. case PLAY_NEXT:
  463. removeHandler();
  464. mPlayIndex++;
  465. if (mPlayIndex > mVideoBean.length - 1) {
  466. mView.activityFinish();
  467. } else {
  468. try {
  469. ToastUtil.showToast("即将为您播放下一个:" + mVideoBean[mPlayIndex].videoname);
  470. mVideoName.setText(mVideoBean[mPlayIndex].videoname);
  471. mPlayingId = mVideoBean[mPlayIndex].videoid;
  472. mPlayNeedPost = mVideoBean[mPlayIndex].videoneedpost;
  473. mPlayStartTime = Integer.valueOf(mVideoBean[mPlayIndex].videoplaytime);
  474. if (Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)) == null || Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)).equals("")) {
  475. //可能是没权限,直接退出
  476. mView.activityFinish();
  477. // return true;
  478. } else {
  479. mVideoHandler.sendEmptyMessage(SET_INFO);
  480. mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
  481. mVideoHandler.sendEmptyMessage(SHOW_CONTROLLER);
  482. mVideoHandler.sendEmptyMessage(SHOW_STATUS_IMAGE);
  483. mVideoHandler.sendEmptyMessageDelayed(HIDE_STATUS_IMAGE, 500);
  484. mView.start();
  485. }
  486. } catch (Exception e) {
  487. e.printStackTrace();
  488. mView.activityFinish();
  489. }
  490. }
  491. break;
  492. case DISCONNECT_NETWORK:
  493. mVideoHandler.post(new Runnable() {
  494. @Override
  495. public void run() {
  496. showDisConnNeWorkWindow();
  497. }
  498. });
  499. break;
  500. case CONNECT_NETWORK:
  501. try {
  502. if (mErrorViewDialog != null) {
  503. mErrorViewDialog.dismiss();
  504. }
  505. mView.stop();
  506. mView.releaseVideo();
  507. mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
  508. mErrorViewDialog.dismiss();
  509. mView.seek(mNetWorkErrorTime);
  510. mView.start();
  511. } catch (Exception e) {
  512. e.printStackTrace();
  513. }
  514. break;
  515. case SHOW_TOUCHVIEW:
  516. mTouchView.setVisibility(View.VISIBLE);
  517. break;
  518. case HIDE_TOUCHVIEW:
  519. mTouchView.setVisibility(View.GONE);
  520. break;
  521. }
  522. return false;
  523. }
  524. });
  525. /*
  526. * 切换status图片
  527. * */
  528. void checkStatus(final int status) {
  529. mLittleIcon.post(new Runnable() {
  530. @Override
  531. public void run() {
  532. switch (status) {
  533. case STATUS_PLAY:
  534. if (mStatusCode != STATUS_PLAY) {
  535. mStatusCode = STATUS_PLAY;
  536. mPlayerStatus.setImageBitmap(mStatusPlayBitmap);
  537. mLittleIcon.setImageBitmap(mLittleIconPlayBitmap);
  538. }
  539. break;
  540. case STATUS_PAUSE:
  541. if (mStatusCode != STATUS_PAUSE) {
  542. mStatusCode = STATUS_PAUSE;
  543. mLittleIcon.setImageBitmap(mLittleIconPauseBitmap);
  544. }
  545. break;
  546. case STATUS_FORWARD:
  547. if (mStatusCode != STATUS_FORWARD) {
  548. mStatusCode = STATUS_FORWARD;
  549. }
  550. break;
  551. case STATUS_REWIND:
  552. if (mStatusCode != STATUS_REWIND) {
  553. mStatusCode = STATUS_REWIND;
  554. }
  555. break;
  556. }
  557. }
  558. });
  559. }
  560. void showDisConnNeWorkWindow() {
  561. if (mErrorView == null) {
  562. mErrorViewDialog = new Dialog(mView.getActivity());
  563. try {
  564. int dividerID = mView.getActivity().getResources().getIdentifier("android:id/titleDivider", null, null);
  565. View divider = mErrorViewDialog.findViewById(dividerID);
  566. divider.setBackgroundColor(Color.TRANSPARENT);
  567. } catch (Exception e) {
  568. //上面的代码,是用来去除Holo主题的蓝色线条
  569. e.printStackTrace();
  570. }
  571. mErrorView = new ErrorView(mView);
  572. mErrorView.setBtnClickListener(new ErrorView.BtnClickListener() {
  573. @Override
  574. public void clickRelase() {
  575. // mView.start();
  576. try {
  577. if (ContextUtil.getNetWorkState()) {
  578. mView.stop();
  579. mView.releaseVideo();
  580. mView.setVideoUri(Uri.parse(AesUtil.Decrypt(mVideoBean[mPlayIndex].videourl)));
  581. mErrorViewDialog.dismiss();
  582. mView.seek(mNetWorkErrorTime);
  583. mView.start();
  584. } else {
  585. ToastUtil.showToast("请检查网络连接状况");
  586. }
  587. } catch (Exception e) {
  588. e.printStackTrace();
  589. }
  590. }
  591. @Override
  592. public void clickExit() {
  593. mErrorViewDialog.dismiss();
  594. EApplication.clearActivity();
  595. Intent intent_restart = new Intent(ContextUtil.CLOSE_ACTIVITY_MAIN);
  596. mView.getActivity().sendBroadcast(intent_restart);
  597. System.exit(0);
  598. }
  599. });
  600. mErrorViewDialog.setCancelable(false);
  601. mErrorViewDialog.setContentView(mErrorView);
  602. Window dialogWindow = mErrorViewDialog.getWindow();
  603. dialogWindow.setGravity(Gravity.CENTER);
  604. dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
  605. dialogWindow.getDecorView().setBackgroundColor(Color.parseColor("#80000000"));
  606. WindowManager m = mView.getActivity().getWindowManager();
  607. Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
  608. WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
  609. p.height = (int) (d.getHeight() * 1);
  610. p.width = WindowManager.LayoutParams.MATCH_PARENT;
  611. p.horizontalMargin = 0;
  612. dialogWindow.setAttributes(p);
  613. }
  614. if (!mErrorViewDialog.isShowing()) {
  615. mErrorViewDialog.show();
  616. }
  617. }
  618. void playerCompletion() {
  619. mPlayerBackTime = 0;
  620. switch (mPlayType) {
  621. case TYPE_SEPARATELY_PLAY:
  622. ToastUtil.showToast("播放完成");
  623. removeHandler();
  624. mView.activityFinish();
  625. break;
  626. case TYPE_SINGLECYCLE_PLAY:
  627. ToastUtil.showToast("重新播放");
  628. removeHandler();
  629. mVideoHandler.sendEmptyMessage(SET_INFO);
  630. mView.seek(0);
  631. mView.start();
  632. return;
  633. case TYPE_LIST_PLAY:
  634. NotificationWebPlayerTime();
  635. mVideoHandler.sendEmptyMessage(PLAY_NEXT);
  636. return;
  637. }
  638. }
  639. public void NotificationWebPlayerTime() {
  640. Intent intent = new Intent(ContextUtil.NOTIFICATION_WEB_PLAYERTIME);
  641. intent.putExtra("over_time", String.valueOf(mPlayerBackTime));
  642. intent.putExtra("over_id", String.valueOf(mPlayingId));
  643. intent.putExtra("over_neetpost", mPlayNeedPost);
  644. intent.putExtra("over_moduletype", mPlayerModuleType);
  645. mView.getActivity().sendBroadcast(intent);
  646. }
  647. private boolean firstScroll = false;
  648. private int GESTURE_FLAG = 0;// 1,调节进度,2,调节音量,3.调节亮度
  649. private static final int GESTURE_MODIFY_PROGRESS = 1;
  650. private static final int GESTURE_MODIFY_VOLUME = 2;
  651. private static final int GESTURE_MODIFY_BRIGHT = 3;
  652. private int playerWidth;
  653. private int maxVolume, currentVolume;
  654. private AudioManager audiomanager;
  655. private float mBrightness = -1f; // 亮度
  656. private static final float STEP_PROGRESS = 3f;// 设定进度滑动时的步长,避免每次滑动都改变,导致改变过快
  657. private static final float STEP_VOLUME = 3f;// 协调音量滑动时的步长,避免每次滑动都改变,导致改变过快
  658. @Override
  659. public boolean onDown(MotionEvent e) {
  660. firstScroll = true;// 设定是触摸屏幕后第一次scroll的标志
  661. return false;
  662. }
  663. @Override
  664. public void onShowPress(MotionEvent e) {
  665. }
  666. @Override
  667. public boolean onSingleTapUp(MotionEvent e) {
  668. return true;
  669. }
  670. @Override
  671. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  672. // TODO Auto-generated method stub
  673. mVideoHandler.removeMessages(HIDE_TOUCHVIEW);
  674. float mOldX = e1.getX(), mOldY = e1.getY();
  675. int y = (int) e2.getRawY();
  676. if (firstScroll) {// 以触摸屏幕后第一次滑动为标准,避免在屏幕上操作切换混乱
  677. // 横向的距离变化大则调整进度,纵向的变化大则调整音量
  678. if (Math.abs(distanceX) >= Math.abs(distanceY)) {
  679. GESTURE_FLAG = GESTURE_MODIFY_PROGRESS;
  680. } else {
  681. if (mOldX > playerWidth / 2.0f) {// 音量
  682. GESTURE_FLAG = GESTURE_MODIFY_VOLUME;
  683. } else if (mOldX < playerWidth / 2.0f) {// 亮度
  684. GESTURE_FLAG = GESTURE_MODIFY_BRIGHT;
  685. }
  686. }
  687. }
  688. // 如果每次触摸屏幕后第一次scroll是调节进度,那之后的scroll事件都处理音量进度,直到离开屏幕执行下一次操作
  689. if (GESTURE_FLAG == GESTURE_MODIFY_PROGRESS) {
  690. }
  691. // 如果每次触摸屏幕后第一次scroll是调节音量,那之后的scroll事件都处理音量调节,直到离开屏幕执行下一次操作
  692. else if (GESTURE_FLAG == GESTURE_MODIFY_VOLUME) {
  693. currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值
  694. mTouchSeek.setProgress(currentVolume);
  695. if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动
  696. if (distanceY >= dip2px(STEP_VOLUME)) {// 音量调大,注意横屏时的坐标体系,尽管左上角是原点,但横向向上滑动时distanceY为正
  697. if (currentVolume < maxVolume) {// 为避免调节过快,distanceY应大于一个设定值
  698. currentVolume = currentVolume + oneVolume;
  699. }
  700. // gesture_iv_player_volume.setImageResource(R.drawable.souhu_player_volume);
  701. } else if (distanceY <= -dip2px(STEP_VOLUME)) {// 音量调小
  702. if (currentVolume > 0) {
  703. currentVolume = currentVolume - oneVolume;
  704. if (currentVolume == 0) {// 静音,设定静音独有的图片
  705. // gesture_iv_player_volume
  706. // .setImageResource(R.drawable.souhu_player_silence);
  707. }
  708. }
  709. }
  710. // geture_tv_volume_percentage.setText(percentage + "%");
  711. mTouchText.setText("音量");
  712. mTouchIcon.setImageBitmap(BitmapFactory.decodeResource(mView.getActivity().getResources(), R.drawable.player_volume_icon));
  713. mVideoHandler.sendEmptyMessage(SHOW_TOUCHVIEW);
  714. mTouchSeek.setProgress((currentVolume));
  715. audiomanager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);
  716. }
  717. }
  718. // 如果每次触摸屏幕后第一次scroll是调节亮度,那之后的scroll事件都处理亮度调节,直到离开屏幕执行下一次操作
  719. else if (GESTURE_FLAG == GESTURE_MODIFY_BRIGHT) {
  720. Logger.e("亮度....");
  721. WindowManager.LayoutParams lpa = mView.getActivity().getWindow().getAttributes();
  722. // gesture_iv_player_bright.setImageResource(R.drawable.souhu_player_bright);
  723. mTouchSeek.setProgress(lpa.screenBrightness);
  724. if (mBrightness < 0) {
  725. mBrightness = mView.getActivity().getWindow().getAttributes().screenBrightness;
  726. if (mBrightness <= 0.00f)
  727. mBrightness = 0.00f;
  728. }
  729. if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动
  730. if (distanceY >= dip2px(STEP_VOLUME)) {
  731. if (mBrightness < 1.0f) {// 为避免调节过快,distanceY应大于一个设定值
  732. mBrightness += 0.1f;
  733. }
  734. } else if (distanceY <= -dip2px(STEP_VOLUME)) {
  735. if (mBrightness > 0) {
  736. mBrightness -= 0.1f;
  737. }
  738. }
  739. }
  740. if (mBrightness > 1.0f) {
  741. mBrightness = 1.0f;
  742. } else if (mBrightness < 0.01f) {
  743. mBrightness = 0.01f;
  744. }
  745. lpa.screenBrightness = mBrightness;
  746. mTouchText.setText("亮度");
  747. mTouchIcon.setImageBitmap(BitmapFactory.decodeResource(mView.getActivity().getResources(), R.drawable.player_brightness_icon));
  748. mVideoHandler.sendEmptyMessage(SHOW_TOUCHVIEW);
  749. mTouchSeek.setProgress((mBrightness * 10));
  750. mView.getActivity().getWindow().setAttributes(lpa);
  751. // geture_tv_bright_percentage.setText((int) (lpa.screenBrightness * 100) + "%");
  752. }
  753. firstScroll = false;// 第一次scroll执行完成,修改标志
  754. return false;
  755. }
  756. public int dip2px(float dpValue) {
  757. final float scale = mView.getActivity().getResources().getDisplayMetrics().density;
  758. return (int) (dpValue * scale + 0.5f);
  759. }
  760. @Override
  761. public void onLongPress(MotionEvent e) {
  762. }
  763. @Override
  764. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  765. return false;
  766. }
  767. @Override
  768. public boolean onSingleTapConfirmed(MotionEvent e) {
  769. Logger.e("onSingleTapConfirmed");
  770. if (mPersenter.isShowController()) {
  771. mPersenter.hideController();
  772. } else {
  773. mPersenter.showController();
  774. }
  775. return false;
  776. }
  777. @Override
  778. public boolean onDoubleTap(MotionEvent e) {
  779. Logger.e("onDoubleTap");
  780. if (mView.isPlaying()) {
  781. mView.pause();
  782. mPersenter.checkStatus(mPersenter.STATUS_PLAY);
  783. mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_STATUS_IMAGE);
  784. mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_CONTROLLER);
  785. } else {
  786. mView.start();
  787. mPersenter.checkStatus(mPersenter.STATUS_PAUSE);
  788. mPersenter.mPlayerStatus.setVisibility(View.INVISIBLE);
  789. mPersenter.mVideoHandler.sendEmptyMessage(mPersenter.SHOW_CONTROLLER);
  790. }
  791. return false;
  792. }
  793. @Override
  794. public boolean onDoubleTapEvent(MotionEvent e) {
  795. return false;
  796. }
  797. }
  798. interface VideoIPersenter extends BasePersenter {
  799. void loadVideo(Intent intent);
  800. boolean onKeyDown(int keycode, KeyEvent event);
  801. boolean onKeyUp(int keycode, KeyEvent event);
  802. void removeHandler();
  803. View getPlayerController();
  804. void showController();
  805. void hideController();
  806. boolean isShowController();
  807. void onCompletion();
  808. void onPrepared();
  809. void onInfo(int what, int extra);
  810. boolean onError(int what, int extra);
  811. void destroy();
  812. boolean onTouchEvent(MotionEvent event);
  813. void onSaveInstanceState(Bundle outState);
  814. void onRestoreInstanceState(Bundle savedInstanceState);
  815. void onResume();
  816. }
  817. class VideoJsonBean {
  818. public String videourl;
  819. public String videoname;
  820. public String videoid;
  821. public String videoplaytime;
  822. public String videoneedpost;
  823. }