浏览代码

添加了播放器测试页

lyn 5 年之前
父节点
当前提交
1e27537506

+ 1 - 1
app/build.gradle

@@ -45,7 +45,7 @@ android {
 }
 
 dependencies {
-    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
+    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
     implementation 'com.android.support:appcompat-v7:28.0.0'
     implementation 'com.android.support.constraint:constraint-layout:1.1.3'
     implementation 'androidx.appcompat:appcompat:1.0.2'

+ 6 - 2
app/src/main/AndroidManifest.xml

@@ -3,6 +3,7 @@
     package="com.haochuan.hciptvbasic">
 
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+
     <application
         android:name=".BaseApp"
         android:allowBackup="true"
@@ -11,14 +12,17 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".test.TestActivity">
+        <activity android:name=".test.TestPlayerActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
+
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".MainActivity">
+        <activity android:name=".test.TestActivity">
+
         </activity>
+        <activity android:name=".MainActivity"></activity>
 
         <uses-library
             android:name="android.test.runner"

+ 0 - 1
app/src/main/java/com/haochuan/hciptvbasic/Util/ToolsUtil.java

@@ -257,7 +257,6 @@ public class ToolsUtil {
                 @Override
                 public void onFailed(int what, com.yanzhenjie.nohttp.rest.Response<String> response) {
                     Logger.w("clientWebRequest,请求认证失败:" + what);
-                    listener.OnResponse(-1,"{}",tag);
                 }
 
                 @Override

+ 313 - 0
app/src/main/java/com/haochuan/hciptvbasic/test/TestPlayerActivity.java

@@ -0,0 +1,313 @@
+package com.haochuan.hciptvbasic.test;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.haochuan.hciptvbasic.R;
+import com.haochuan.hciptvbasic.Util.Logger;
+import com.haochuan.hciptvbasic.video.HCPlayer;
+import com.haochuan.hciptvbasic.video.IVideoPlayer;
+
+import java.math.BigDecimal;
+import java.util.Formatter;
+import java.util.Locale;
+
+public class TestPlayerActivity extends AppCompatActivity implements IVideoPlayer {
+
+    //页面组件对象
+    private HCPlayer hcPlayer;
+    private ProgressBar loadingBar;
+    private LinearLayout bottomContainer;
+    private SeekBar videoProgressBar;
+    private TextView showTimeView;
+
+    //全局参数
+    private String testUrl = "https://gzhc-sxrj.oss-cn-shenzhen.aliyuncs.com/gzhc-djbl/djbl01.mp4";
+    private int duration = 0;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_test_player);
+
+        hcPlayer = findViewById(R.id.hc_player);
+        loadingBar = findViewById(R.id.loading);
+        bottomContainer = findViewById(R.id.layout_bottom);
+        videoProgressBar = findViewById(R.id.progress_bar);
+        showTimeView = findViewById(R.id.current_total);
+
+        loadingBar.setMax(100);
+        loadingBar.setProgress(0);
+
+        hcPlayer.setIVideoPlayerListener(this);
+        hcPlayer.play(testUrl);
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        int keyCode = event.getKeyCode();
+        switch (keyCode){
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                if(event.getAction() == KeyEvent.ACTION_DOWN){
+                    seekForward();
+                }
+                return true;
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                if(event.getAction() == KeyEvent.ACTION_DOWN){
+                    seekBack();
+                }
+                return true;
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+                if(event.getAction() == KeyEvent.ACTION_DOWN){
+                    showBottomContainer();
+                }
+                break;
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+                if(event.getAction() == KeyEvent.ACTION_DOWN){
+                    playOrPause();
+                }
+                break;
+            case KeyEvent.KEYCODE_ENTER:
+                if(event.getAction() == KeyEvent.ACTION_DOWN){
+                    playOrPause();
+                }
+                break;
+            case KeyEvent.KEYCODE_BACK:
+                showExitDialog();
+                break;
+            default:
+                break;
+        }
+
+        return super.dispatchKeyEvent(event);
+    }
+
+
+
+    /*------------------------------具体功能实现------------------------------*/
+    //向前拖动
+    private void seekForward(){
+        hcPlayer.seek(hcPlayer.getCurrentPlayPosition() + 1000);
+        showBottomContainer();
+    }
+
+    //向后拖动
+    private void seekBack(){
+        hcPlayer.seek(hcPlayer.getCurrentPlayPosition() - 1000);
+        showBottomContainer();
+    }
+
+    //暂停或者启动
+    private void playOrPause(){
+        if(hcPlayer.isPrePared()){
+            if(hcPlayer.isPlaying()){
+                hcPlayer.pause();
+                Logger.d("playOrPause,暂停");
+                showBottomContainer();
+            }else{
+                hcPlayer.resume();
+                Logger.d("playOrPause,恢复播放");
+            }
+        }
+    }
+
+    //显示底部容器
+    private void showBottomContainer(){
+        bottomContainer.setVisibility(View.VISIBLE);
+        //开始刷新底部容器里的进度条进度和播放时间
+        refreshProgressAndTimeImmed();
+        //延迟3秒后隐藏
+        hideBottomContainerDelay();
+    }
+
+    //立即刷新进度和时间
+    private void refreshProgressAndTimeImmed(){
+        hcPlayer.getRootView().post(showProgressAndTimeRunnable);
+        refreshProgressAndTime();
+    }
+
+    private void refreshProgressAndTime(){
+        hcPlayer.getRootView().postDelayed(showProgressAndTimeRunnable,500L);
+    }
+
+    //延迟三秒隐藏底部容器
+    private void hideBottomContainerDelay(){
+        hcPlayer.getRootView().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                hideBottomContainer();
+            }
+        },5000L);
+    }
+
+    //隐藏底部容器
+    private void hideBottomContainer(){
+        bottomContainer.setVisibility(View.INVISIBLE);
+        //开始刷新底部容器里的进度条进度和播放时间
+        hcPlayer.getRootView().removeCallbacks(showProgressAndTimeRunnable);
+
+    }
+
+    //显示退出框
+    private void showExitDialog(){
+        new AlertDialog.Builder(this)
+                .setTitle("退出")
+                .setMessage("确认退出吗?")
+                .setNegativeButton("重播", new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                hcPlayer.play(testUrl);
+            }
+        }).setPositiveButton("退出", new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                TestPlayerActivity.this.runOnUiThread(() -> {
+                    android.os.Process.killProcess(android.os.Process.myPid());   //获取PID
+                    System.exit(0);
+                });
+            }
+        }).show();
+
+    }
+
+    //将毫秒转为hh:mm:ss格式
+    public static String timeToString(long timeMs) {
+        if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) {
+            return "00:00";
+        }
+        long totalSeconds = timeMs / 1000;
+        long seconds = totalSeconds % 60;
+        long minutes = (totalSeconds / 60) % 60;
+        long hours = totalSeconds / 3600;
+        StringBuilder stringBuilder = new StringBuilder();
+        Formatter mFormatter = new Formatter(stringBuilder, Locale.getDefault());
+        if (hours > 0) {
+            return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
+        } else {
+            return mFormatter.format("%02d:%02d", minutes, seconds).toString();
+        }
+    }
+
+    /**
+     * 获取比例
+     *
+     * @param current 分子
+     * @param max     分母
+     * @return 比例(0-100)
+     */
+    public static int percent(long current, long max) {
+        Logger.d(String.format("current:%s,max:%s",current,max));
+        return (int) (halfUp((float) current / max, 2) * zeroCountToNum(2));
+    }
+
+    /**
+     * 根据count值得到1(count个数的0)的数。例如count为2,则得到100,count为1则得到10,count小于0则得到1
+     *
+     * @param count 1后补增的0个数
+     * @return long
+     */
+    public static long zeroCountToNum(int count) {
+        long num = 1;
+        if (count <= 0) {
+            return num;
+        }
+        for (int i = 1; i <= count; i++) {
+            num *= 10;
+        }
+        return num;
+    }
+
+    /**
+     * 获取四舍五入的值
+     *
+     * @param value    需要转换的数值
+     * @param newScale 小数点保留位数
+     * @return 四舍五入后的值。
+     */
+    public static float halfUp(float value, int newScale) {
+        return getBigDecimal(value, newScale, BigDecimal.ROUND_HALF_UP);
+    }
+
+    private static float getBigDecimal(float value, int newScale, int roundingMode) {
+        BigDecimal bigDecimal = new BigDecimal(value);
+        return bigDecimal.setScale(newScale, roundingMode).floatValue();
+    }
+
+
+    /*------------------------Runnable--------------------------*/
+    private Runnable showProgressAndTimeRunnable =new Runnable() {
+        @Override
+        public void run() {
+            int currentPosition =hcPlayer.getCurrentPlayPosition();
+            Logger.d("currentPosition:" + currentPosition);
+            //显示右边时间进度
+            StringBuilder sb = new StringBuilder();
+            sb.append(timeToString(currentPosition));
+            sb.append("/");
+            sb.append(timeToString(duration));
+            showTimeView.setText(sb.toString());
+
+            //显示进度条
+            videoProgressBar.setProgress(percent(currentPosition,duration));
+
+            refreshProgressAndTime();
+        }
+    };
+
+
+    /*--------------------IVideoPlayer 接口实现---------------------*/
+
+    @Override
+    public void onPreparing() {
+        loadingBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onPlaying() {
+        loadingBar.setVisibility(View.GONE);
+        duration = hcPlayer.getDuration();
+        Logger.d("duration:" + duration);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    public void onPlayingBuffering() {
+        loadingBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onCompletion() {
+        showExitDialog();
+    }
+
+    @Override
+    public void onError(int what, int extra) {
+
+    }
+}

+ 11 - 0
app/src/main/java/com/haochuan/hciptvbasic/video/EmptyControlVideoView.java

@@ -6,6 +6,7 @@ import android.util.AttributeSet;
 import androidx.annotation.NonNull;
 
 import com.haochuan.hciptvbasic.R;
+import com.shuyu.gsyvideoplayer.utils.Debuger;
 import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
 
 /**
@@ -124,6 +125,12 @@ public class EmptyControlVideoView extends StandardGSYVideoPlayer {
         return mHadPrepared;
     }
 
+    public boolean isPlaying(){
+        return (mCurrentState >= 0 && mCurrentState != CURRENT_STATE_NORMAL
+                && mCurrentState != CURRENT_STATE_AUTO_COMPLETE
+                && mCurrentState != CURRENT_STATE_ERROR && mCurrentState != CURRENT_STATE_PAUSE);
+    }
+
     public Context getCurrentContext(){
         return getActivityContext();
     }
@@ -155,6 +162,10 @@ public class EmptyControlVideoView extends StandardGSYVideoPlayer {
         return currentStatus;
     }
 
+    public void enableDebug(){
+        Debuger.enable();
+    }
+
     /*-----------------*/
 
 

+ 7 - 3
app/src/main/java/com/haochuan/hciptvbasic/video/HCGsyVideoPlayer.java

@@ -14,7 +14,6 @@ public class HCGsyVideoPlayer extends BaseMediaPlayer {
 
     private EmptyControlVideoView mEmptyControlVideo;        //GSY播放器实例
 
-
     public HCGsyVideoPlayer(@NonNull Context context) {
         super(context);
         init(context);
@@ -37,10 +36,15 @@ public class HCGsyVideoPlayer extends BaseMediaPlayer {
     private void init(Context context){
         View.inflate(context, R.layout.player_gsy_hc,this);
         mEmptyControlVideo = findViewById(R.id.empty_control_video);
+        mEmptyControlVideo.enableDebug();
     }
 
     public void setVideoPlayerListener(@NonNull IVideoPlayer iVideoPlayer){
-        mEmptyControlVideo.setVideoPlayerListener(iVideoPlayer);
+        if(mEmptyControlVideo != null){
+            mEmptyControlVideo.setVideoPlayerListener(iVideoPlayer);
+        }else{
+            Logger.w("mEmptyControlVideo is null,can`t setVideoPlayerListener");
+        }
     }
 
 
@@ -81,7 +85,7 @@ public class HCGsyVideoPlayer extends BaseMediaPlayer {
 
     @Override
     public boolean isPlaying() {
-        return mEmptyControlVideo.isInPlayingState();
+        return mEmptyControlVideo.isPlaying();
     }
 
     @Override

+ 61 - 10
app/src/main/java/com/haochuan/hciptvbasic/video/HCPlayer.java

@@ -10,6 +10,9 @@ import androidx.annotation.Nullable;
 import com.haochuan.hciptvbasic.R;
 import com.haochuan.hciptvbasic.Util.Logger;
 
+import static com.haochuan.hciptvbasic.Util.MessageCode.PLAYER_OBJ_NULL;
+import static com.haochuan.hciptvbasic.Util.MessageCode.SUCCESS;
+
 public class HCPlayer extends BaseMediaPlayer implements IVideoPlayer{
 
     private HCGsyVideoPlayer mHcGsyVideoPlayer;
@@ -125,51 +128,99 @@ public class HCPlayer extends BaseMediaPlayer implements IVideoPlayer{
 
     @Override
     public void resume() {
-        mHcGsyVideoPlayer.resume();
+        if(mHcGsyVideoPlayer != null){
+            mHcGsyVideoPlayer.resume();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t resume");
+        }
     }
 
     @Override
     public void pause() {
-        mHcGsyVideoPlayer.pause();
+        if(mHcGsyVideoPlayer != null){
+            mHcGsyVideoPlayer.pause();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t pause");
+        }
     }
 
     @Override
     public void seek(int position) {
-        mHcGsyVideoPlayer.seek(position);
+        if(mHcGsyVideoPlayer != null){
+            mHcGsyVideoPlayer.seek(position);
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t seek");
+        }
     }
 
     @Override
     public void release() {
-        mHcGsyVideoPlayer.release();
+        if(mHcGsyVideoPlayer != null){
+            mHcGsyVideoPlayer.release();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t release");
+        }
     }
 
     @Override
     public boolean isPlaying() {
-        return mHcGsyVideoPlayer.isPlaying();
+        if(mHcGsyVideoPlayer != null){
+            return mHcGsyVideoPlayer.isPlaying();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get isPlaying state");
+            return false;
+        }
     }
 
     @Override
     public boolean isPrePared() {
-        return mHcGsyVideoPlayer.isPrePared();
+        if(mHcGsyVideoPlayer != null){
+            return mHcGsyVideoPlayer.isPrePared();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get prepared state");
+            return false;
+        }
     }
 
     @Override
     public int getDuration() {
-        return mHcGsyVideoPlayer.getDuration();
+        if(mHcGsyVideoPlayer != null){
+            return mHcGsyVideoPlayer.getDuration();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get duration");
+            return 0;
+        }
     }
 
     @Override
     public int getCurrentPlayPosition() {
-        return mHcGsyVideoPlayer.getCurrentPlayPosition();
+        if(mHcGsyVideoPlayer != null){
+            return mHcGsyVideoPlayer.getCurrentPlayPosition();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get current play position");
+            return 0;
+        }
     }
 
     @Override
     public int getCurrentStatus() {
-        return 0;
+        if(mHcGsyVideoPlayer != null){
+            return mHcGsyVideoPlayer.getCurrentStatus();
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get current status");
+            return 0;
+        }
     }
 
-    public void setSpeed(@NonNull float speed){
+    public int setSpeed(@NonNull float speed){
         mHcGsyVideoPlayer.setSpeed(speed);
+        if(mHcGsyVideoPlayer != null){
+            mHcGsyVideoPlayer.setSpeed(speed);
+            return SUCCESS;
+        }else{
+            Logger.w("mHcGsyVideoPlayer is null,can`t get current status");
+            return PLAYER_OBJ_NULL;
+        }
     }
 
 

+ 3 - 3
app/src/main/java/com/haochuan/hciptvbasic/webview/ToolToJS.java

@@ -37,7 +37,7 @@ public class ToolToJS {
     private String JS_EVENT_LOG = "javascript:onLog('%s')";
 
     //将response传递给js
-    private String JS_EVENT_RESPONSE ="javascript:onWebRequestResponse('%s','%s','%s')";
+    private String JS_EVENT_RESPONSE ="javascript:onWebRequestResponse('%s','%s')";
 
     //开始下载事件
     private String JS_EVENT_DOWNLOAD_START = "javascript:onDownloadStart()";
@@ -296,9 +296,9 @@ public class ToolToJS {
             String tag = requestParams.has("tag")?requestParams.get("tag").toString():"";
             toolsUtil.clientWebRequest(url, method, contentType, headJson,paramJson, ignoreResult, tag,
                     (int what,String response,String tag1)->{
-                        Logger.d(String.format("what:%s,response:%s;tag:%s",what,response,tag1));
+                        Logger.d(String.format("response:%s;tag:%s",response,tag1));
                         JsUtil.evaluateJavascript(context,webView,
-                                String.format(JS_EVENT_RESPONSE,what,response,tag1));
+                                String.format(JS_EVENT_RESPONSE,response,tag1));
                     });
             return SUCCESS;
         }catch (Exception e){

+ 77 - 0
app/src/main/res/layout/activity_test_player.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".test.TestPlayerActivity">
+    <com.haochuan.hciptvbasic.video.HCPlayer
+        android:id="@+id/hc_player"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+    <!--loading-->
+    <ProgressBar
+        android:id="@+id/loading"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:visibility="visible"
+        android:layout_centerInParent="true" />
+
+    <!--底部栏-->
+    <LinearLayout
+        android:id="@+id/layout_bottom"
+        android:layout_width="match_parent"
+        android:visibility="gone"
+        android:layout_height="80dp"
+        android:paddingLeft="50dp"
+        android:paddingRight="50dp"
+        android:layout_marginLeft="11.3dp"
+        android:layout_marginBottom="11.3dp"
+        android:layout_marginRight="11.3dp"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentStart="true"
+        android:background="#b3000000"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <!--左边播放/暂停按钮-->
+        <ImageView
+            android:id="@+id/start"
+            android:layout_width="57.3dp"
+            android:layout_height="57.3dp"
+            android:layout_marginStart="11.3dp"
+            />
+
+        <!--进度条-->
+        <SeekBar
+            android:id="@+id/progress_bar"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:focusable="true"
+            android:gravity="center"
+            android:max="100"
+            android:maxHeight="4.0dp"
+            android:minHeight="4.0dp"
+            android:layout_marginLeft="8dp"
+            android:paddingBottom="8.0dp"
+            android:paddingLeft="10.6dp"
+            android:paddingRight="10.6dp"
+            android:paddingTop="8.0dp"
+            />
+
+        <!--播放进度/播放总时长显示-->
+        <TextView
+            android:id="@+id/current_total"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="11.3dp"
+            android:text="00:00/00:00"
+            android:textColor="#eaebec"
+            android:textSize="18.6dp"
+            />
+
+    </LinearLayout>
+
+</RelativeLayout>