Przeglądaj źródła

修复方讫松测试机无法正常显示游戏详情中视频的问题;
优化游戏详情中视频播放速度

zengjiebin 7 lat temu
rodzic
commit
9a1e6e28f1

+ 1 - 1
app/build.gradle

@@ -451,7 +451,7 @@ dependencies {
     implementation(name: 'cachewebviewlib-2.1.8', ext: 'aar')
 
     //GSYVideoPlayer https://github.com/CarGuo/GSYVideoPlayer
-    implementation 'com.shuyu:gsyVideoPlayer-java:6.0.2'
+    implementation 'com.shuyu:gsyVideoPlayer-java:6.0.3'
 
     //是否需要ExoPlayer模式
     implementation 'com.shuyu:GSYVideoPlayer-exo2:6.0.2'

+ 35 - 4
app/src/main/java/com/sheep/gamegroup/module/game/activity/ActGameGroupOrGameDetail.java

@@ -41,8 +41,10 @@ import com.sheep.gamegroup.module.game.model.GameGroup;
 import com.sheep.gamegroup.util.ApiUtil;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.DataUtil;
+import com.sheep.gamegroup.util.FileUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.util.RefreshUtil;
 import com.sheep.gamegroup.util.RequestCodeConstants;
 import com.sheep.gamegroup.util.TagListUtil;
@@ -63,6 +65,7 @@ import org.afinal.simplecache.ApiKey;
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -75,6 +78,7 @@ import io.reactivex.schedulers.Schedulers;
 
 import static com.sheep.gamegroup.util.UMConfigUtils.Event.FIND_SHARE;
 import static com.sheep.gamegroup.view.adapter.TryMakeMoneyAdp.PUBLIC_TAG_PREFIX_TEXTVIEW_LIST;
+import static com.sheep.jiuyan.samllsheep.utils.ClassFileHelper.DIR;
 
 
 /**
@@ -278,7 +282,11 @@ public class ActGameGroupOrGameDetail extends BaseActivity {
             ViewUtil.setImage(gc_game_app_detail_iv2, ActPlayVideo.getCoverByUrl(mainBublicize));
             //播放按钮
             ViewUtil.setVisibility(gc_game_app_detail_play_iv, true);
-            gc_game_app_detail_play_iv.setOnClickListener(view -> loadVideo());
+            String fileName = FileUtil.getLastSplitEnd(mainBublicize, '/') + ".mp4";
+            String filePath = new File(DIR, fileName).getAbsolutePath();
+            //开始下载视频
+            Jump2View.getInstance().startDownloadService(mainBublicize, filePath);
+            gc_game_app_detail_play_iv.setOnClickListener(view -> loadVideo(filePath));
         } else {//否则当做图片显示
             ViewUtil.setVisibility(videoPlayer, false);
             ViewUtil.setVisibility(gc_game_app_detail_iv, false);
@@ -543,11 +551,11 @@ public class ActGameGroupOrGameDetail extends BaseActivity {
         EventBus.getDefault().unregister(this);
     }
 
-    private void loadVideo() {
+    private void loadVideo(String filePath) {
         ViewUtil.setVisibility(videoPlayer, true);
         //不显示播放按钮
         ViewUtil.setVisibility(gc_game_app_detail_play_iv, false);
-        video_url = gameEntity.getApp().getMain_publicize();
+        video_url = filePath;
         video_title = gameEntity.getApp().getName();
         video_cover_url = ActPlayVideo.getCoverByUrl(gameEntity.getApp().getMain_publicize());
         LayoutParamsUtil.resetLayoutParams(videoPlayer, new Lp().setHeight(gc_game_app_detail_iv2.getHeight()));
@@ -588,21 +596,44 @@ public class ActGameGroupOrGameDetail extends BaseActivity {
                     .setShowFullAnimation(false)
                     .setNeedLockFull(true)
                     .setUrl(getVideoUrl())
-                    .setCacheWithPlay(true)
+                    .setCacheWithPlay(false)
                     .setVideoTitle(getVideoTitle())
                     .setVideoAllCallBack(new GSYSampleCallBack() {
                         @Override
                         public void onPrepared(String url, Object... objects) {
                             super.onPrepared(url, objects);
+                            LogUtil.println("initPlay", "onPrepared", url, objects);
                             isPlay = true;
                         }
 
                         @Override
                         public void onAutoComplete(String url, Object... objects) {
                             super.onAutoComplete(url, objects);
+                            LogUtil.println("initPlay", "onAutoComplete", url, objects);
+                            File file = new File(video_url);
+                            if(file.exists()) {
+                                long totalSpace = file.getTotalSpace();
+                                LogUtil.println("initPlay", "exists file", totalSpace);
+                            }
                             if (videoPlayer != null)
                                 videoPlayer.startPlayLogic();
                         }
+
+                        @Override
+                        public void onPlayError(String url, Object... objects) {
+                            super.onPlayError(url, objects);
+                            File file = new File(video_url);
+                            long curPosition = GSYVideoManager.instance().getCurPlayerManager().getCurrentPosition();
+                            LogUtil.println("initPlay", "onPlayError", url, curPosition);
+                            if(file.exists()){
+                                LogUtil.println("initPlay", "retry play");
+                                if (videoPlayer != null) {
+                                    if(curPosition > 0)
+                                        videoPlayer.setSeekOnStart(curPosition);
+                                    videoPlayer.startPlayLogic();
+                                }
+                            }
+                        }
                     }).build(videoPlayer);
             isInit = true;
         } else {

+ 11 - 1
app/src/main/java/com/sheep/gamegroup/util/FileUtil.java

@@ -158,8 +158,18 @@ public class FileUtil {
      * Java文件操作 获取文件扩展名
      * */
     public static String getExtensionName(String filename) {
+        return getLastSplitEnd(filename, '.');
+    }
+
+    /**
+     * 获取最后一个split字符后的所有字符串
+     * @param filename
+     * @param split
+     * @return
+     */
+    public static String getLastSplitEnd(String filename, char split) {
         if ((filename != null) && (filename.length() > 0)) {
-            int dot = filename.lastIndexOf('.');
+            int dot = filename.lastIndexOf(split);
             if ((dot > -1) && (dot < (filename.length() - 1))) {
                 return filename.substring(dot + 1);
             }

+ 20 - 0
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -2347,6 +2347,26 @@ public class Jump2View {
     public void startDownloadService(Context context, DownLoadInfo downLoadInfo) {
         context.startService(new Intent(context, DownloadService.class).putExtra("download_url", downLoadInfo.getMDownloadUrl()).putExtra("file_path", downLoadInfo.getMApkPath()));
     }
+    /**
+     * 启动下载后台服务进行下载
+     *
+     * @param downloadUrl
+     * @param filePath
+     */
+    public void startDownloadService(String downloadUrl, String filePath) {
+        Context context = SheepApp.getInstance();
+        context.startService(new Intent(context, DownloadService.class).putExtra("download_url", downloadUrl).putExtra("file_path", filePath));
+    }
+    /**
+     * 启动下载后台服务进行下载
+     *
+     * @param downloadUrl
+     * @param filePath
+     */
+    public void startDownloadService(String downloadUrl, String filePath, String type) {
+        Context context = SheepApp.getInstance();
+        context.startService(new Intent(context, DownloadService.class).putExtra("download_url", downloadUrl).putExtra("file_path", filePath).putExtra("type", type));
+    }
 
     /**
      * 有米科技

+ 17 - 1
app/src/main/java/com/sheep/gamegroup/util/TestUtil.java

@@ -262,7 +262,7 @@ public class TestUtil {
      */
     public static void test(final Activity activity) {
         final String[] items = {"复制token", "添加token", "复制打点数据", "从jenkins下载小绵羊安装包", "测试表情包",
-                "跳转QQ", "跳转QQ群","爱奇艺VIP会员", "分享我的签名的小绵羊apk", "分享当前小绵羊apk",
+                "跳转QQ", "跳转QQ群","下载视频测试","爱奇艺VIP会员", "分享我的签名的小绵羊apk", "分享当前小绵羊apk",
                 "测试升级对话框","少数民族姓名", "开启皮肤", "不开启皮肤", "我的游戏", "优惠券弹窗", "填写收件地址弹窗",
                 "朗读文字", "游戏搜索", "测试插件","测试bitmap", "剪切视频", "我的关注", "足迹",
                 "测试联通卡", "测试联通卡2", "测试签名1", "测试签名2", "测试孔剑秋faq正式服",
@@ -287,6 +287,22 @@ public class TestUtil {
             return;
         }
         switch (item) {
+            case "下载视频测试":
+                String downloadUrl = "http://cdn.video.17xmy.com/ljok9RZZvXc5qwvoCxEGudchO6Ti";
+                String fileName = System.currentTimeMillis()+".mp4";
+                Jump2View.getInstance().startDownloadService(downloadUrl, new File(DIR, fileName).getAbsolutePath());
+//                OkHttpUtils.get().url(downloadUrl).build().execute(new FileCallBack(DIR, fileName) {
+//                    @Override
+//                    public void onError(Call call, Exception e, int id) {
+//                        G.showToast(e);
+//                    }
+//
+//                    @Override
+//                    public void onResponse(File response, int id) {
+//                        ViewUtil.showMsgDialog(activity, new DialogConfig().setTitle("提示").setMsg("视频下载完成").setBtnRightText("知道了"));
+//                    }
+//                });
+                break;
             case "爱奇艺VIP会员":
                 Jump2View.getInstance().goWeb(activity, "http://smallstation.kfzs.com/iqiyi_vip_member/#/home-page", item);
                 break;

+ 93 - 54
app/src/main/java/com/sheep/jiuyan/samllsheep/service/DownloadService.java

@@ -32,6 +32,7 @@ import com.sheep.gamegroup.greendao.download.DownLoadInfo;
 import com.sheep.gamegroup.model.entity.Applications;
 import com.sheep.gamegroup.model.entity.TaskEty;
 import com.sheep.gamegroup.util.DownloadUtil;
+import com.sheep.gamegroup.util.FileUtil;
 import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.util.StringUtils;
 import com.sheep.gamegroup.util.TestUtil;
@@ -55,6 +56,7 @@ import static com.sheep.jiuyan.samllsheep.utils.ClassFileHelper.DIR;
 public class DownloadService extends Service {
 
     private final static int TAG_RETRY = 1001;
+    private final static int TAG_TYPE = 1002;
 
     private DownloadUtil downloadUtil;
 
@@ -91,15 +93,20 @@ public class DownloadService extends Service {
         if (intent != null) {
             String download_url = intent.getStringExtra("download_url");
             String file_path = intent.getStringExtra("file_path");
-            startDownload(download_url, file_path, 0);
+            String type = intent.getStringExtra("type");
+            if(type == null){
+                type = FileUtil.getExtensionName(file_path);
+            }
+            startDownload(download_url, file_path, type, 0);
         }
         return super.onStartCommand(intent, flags, startId);
     }
 
-    private void startDownload(String download_url, String file_path, int retry) {
+    private void startDownload(String download_url, String file_path,  String type, int retry) {
         if (download_url != null && file_path != null) {
             DownloadTask task = DownloadUtil.getTask(download_url, file_path);
             task.addTag(TAG_RETRY, retry);
+            task.addTag(TAG_TYPE, type);
             task.enqueue(downloadListener);
         }
     }
@@ -107,8 +114,16 @@ public class DownloadService extends Service {
     private DownloadListener downloadListener = new DownloadListener4WithSpeed() {
         @Override
         public void taskStart(@NonNull DownloadTask task) {
-            LogUtil.println("DownloadListener", "taskStart");
-            DDProviderHelper.getInstance().updateDownload(task.getId(), task.getUrl(), DownloadUtil.STATUS_INIT);
+            String type = (String) task.getTag(TAG_TYPE);
+            LogUtil.println("DownloadListener", "taskStart", task.getTag(TAG_RETRY), type);
+            switch (type){
+                case "mp4":
+                    break;
+                case "apk"://下载游戏
+                default:
+                    DDProviderHelper.getInstance().updateDownload(task.getId(), task.getUrl(), DownloadUtil.STATUS_INIT);
+                    break;
+            }
         }
 
         @Override
@@ -125,8 +140,16 @@ public class DownloadService extends Service {
         public void infoReady(@NonNull DownloadTask task, @NonNull BreakpointInfo info, boolean fromBreakpoint, @NonNull Listener4SpeedAssistExtend.Listener4SpeedModel model) {
             long totalLength = info.getTotalLength();
             LogUtil.println("DownloadListener", "infoReady", "fromBreakpoint", fromBreakpoint, "totalLength", totalLength);
-            DownLoadInfo downloadInfo = downloadUtil.setDownloadTaskTotal(task.getUrl(), totalLength);
-            EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_START).setData(downloadInfo));
+            String type = (String) task.getTag(TAG_TYPE);
+            switch (type){
+                case "mp4":
+                    break;
+                case "apk":
+                default:
+                    DownLoadInfo downloadInfo = downloadUtil.setDownloadTaskTotal(task.getUrl(), totalLength);
+                    EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_START).setData(downloadInfo));
+                    break;
+            }
         }
 
         @Override
@@ -137,8 +160,16 @@ public class DownloadService extends Service {
         @Override
         public void progress(@NonNull DownloadTask task, long currentOffset, @NonNull SpeedCalculator taskSpeed) {
             LogUtil.println("DownloadListener", "progress", "currentOffset", currentOffset, "taskSpeed", taskSpeed.averageSpeed());
-            DownLoadInfo downloadInfo = downloadUtil.setDownloadTaskPercent(currentOffset, taskSpeed.averageSpeed(), task.getId(), task.getUrl());
-            EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_RUNNING).setData(downloadInfo));
+            String type = (String) task.getTag(TAG_TYPE);
+            switch (type){
+                case "mp4":
+                    break;
+                case "apk":
+                default:
+                    DownLoadInfo downloadInfo = downloadUtil.setDownloadTaskPercent(currentOffset, taskSpeed.averageSpeed(), task.getId(), task.getUrl());
+                    EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_RUNNING).setData(downloadInfo));
+                    break;
+            }
         }
 
         @Override
@@ -149,57 +180,65 @@ public class DownloadService extends Service {
         @Override
         public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, @NonNull SpeedCalculator taskSpeed) {
             LogUtil.println("DownloadListener", "taskEnd", "cause", cause.name(), "realCause", realCause != null ? realCause.getMessage() : "null", "taskSpeed", taskSpeed.averageSpeed());
-            if (realCause != null) {
-                realCause.printStackTrace();
-            }
-            DownLoadInfo downLoadInfo;
-            switch (cause) {
-                case COMPLETED://下载完成
-                    if (task.getFile() != null) {
-                        downLoadInfo = downloadUtil.setDownloadTaskFinish(task.getUrl(), task.getFile().getAbsolutePath());
-                        ApkUtils.installApk(getApplicationContext(), task.getFile().getAbsolutePath());
-                        EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_COMPLETE).setData(downLoadInfo));
-                    }
-                    break;
-                case PRE_ALLOCATE_FAILED://预先分配失败
-                    //空间不足,弹框提示
-                    try {
-                        DialogStorageLow.showDialog(realCause != null ? realCause.getMessage() : null);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    downLoadInfo = downloadUtil.getDownloadTaskByUrl(task.getUrl());
-                    downLoadInfo.setMStatus(DownloadUtil.STATUS_FAIL);
-                    if (realCause != null)
-                        downLoadInfo.setRealCauseMsg(realCause.getMessage());
-                    DDProviderHelper.getInstance().updateDownload(downLoadInfo);
-                    EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_FAIL).setData(downLoadInfo));
+            String type = (String) task.getTag(TAG_TYPE);
+            switch (type){
+                case "mp4":
                     break;
-                case FILE_BUSY:
-                case ERROR://下载错误
-                    downLoadInfo = downloadUtil.getDownloadTaskByUrl(task.getUrl());
-                    if (downLoadInfo != null) {
-                        downLoadInfo.setMStatus(DownloadUtil.STATUS_FAIL);
-                        if (realCause != null)
-                            downLoadInfo.setRealCauseMsg(realCause.getMessage());
-                        DDProviderHelper.getInstance().updateDownload(downLoadInfo);
+                case "apk":
+                default:
+                    if (realCause != null) {
+                        realCause.printStackTrace();
                     }
-                    int retry = (int) task.getTag(TAG_RETRY);
-                    if (retry < 15 && task.getFile() != null) {
-                        startDownload(task.getUrl(), task.getFile().getAbsolutePath(), ++retry);
-                        Log.e("DownloadRetry", "Retry " + retry + "   " + task.getUrl());
-                    } else {
-                        if (downLoadInfo != null) {
+                    DownLoadInfo downLoadInfo;
+                    switch (cause) {
+                        case COMPLETED://下载完成
+                            if (task.getFile() != null) {
+                                downLoadInfo = downloadUtil.setDownloadTaskFinish(task.getUrl(), task.getFile().getAbsolutePath());
+                                ApkUtils.installApk(getApplicationContext(), task.getFile().getAbsolutePath());
+                                EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_COMPLETE).setData(downLoadInfo));
+                            }
+                            break;
+                        case PRE_ALLOCATE_FAILED://预先分配失败
+                            //空间不足,弹框提示
+                            try {
+                                DialogStorageLow.showDialog(realCause != null ? realCause.getMessage() : null);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                            downLoadInfo = downloadUtil.getDownloadTaskByUrl(task.getUrl());
+                            downLoadInfo.setMStatus(DownloadUtil.STATUS_FAIL);
+                            if (realCause != null)
+                                downLoadInfo.setRealCauseMsg(realCause.getMessage());
+                            DDProviderHelper.getInstance().updateDownload(downLoadInfo);
                             EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_FAIL).setData(downLoadInfo));
-                        }
+                            break;
+                        case FILE_BUSY:
+                        case ERROR://下载错误
+                            downLoadInfo = downloadUtil.getDownloadTaskByUrl(task.getUrl());
+                            if (downLoadInfo != null) {
+                                downLoadInfo.setMStatus(DownloadUtil.STATUS_FAIL);
+                                if (realCause != null)
+                                    downLoadInfo.setRealCauseMsg(realCause.getMessage());
+                                DDProviderHelper.getInstance().updateDownload(downLoadInfo);
+                            }
+                            int retry = (int) task.getTag(TAG_RETRY);
+                            if (retry < 15 && task.getFile() != null) {
+                                startDownload(task.getUrl(), task.getFile().getAbsolutePath(), type, ++retry);
+                                Log.e("DownloadRetry", "Retry " + retry + "   " + task.getUrl());
+                            } else {
+                                if (downLoadInfo != null) {
+                                    EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_FAIL).setData(downLoadInfo));
+                                }
+                            }
+                            break;
+                        case CANCELED://取消下载
+                            downLoadInfo = downloadUtil.setDownloadTaskStatus(task.getUrl(), DownloadUtil.STATUS_PAUSE);
+                            EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_STOP).setData(downLoadInfo));
+                            break;
+                        case SAME_TASK_BUSY:
+                            break;
                     }
                     break;
-                case CANCELED://取消下载
-                    downLoadInfo = downloadUtil.setDownloadTaskStatus(task.getUrl(), DownloadUtil.STATUS_PAUSE);
-                    EventBus.getDefault().post(new BigEvent().setEventTypes(EventTypes.DOWNLOAD_STOP).setData(downLoadInfo));
-                    break;
-                case SAME_TASK_BUSY:
-                    break;
             }
 
         }

+ 20 - 8
app/src/main/res/layout/act_game_group_or_game_detail.xml

@@ -50,7 +50,7 @@
                 android:focusableInTouchMode="true"
                 android:orientation="vertical">
 
-                <RelativeLayout
+                <android.support.constraint.ConstraintLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content">
 
@@ -59,22 +59,26 @@
                         android:layout_width="match_parent"
                         android:layout_height="216dp"
                         android:scaleType="centerCrop"
-                        android:src="@drawable/loading_01" />
+                        android:src="@drawable/loading_01"
+                        app:layout_constraintTop_toTopOf="parent"/>
 
                     <ImageView
                         android:id="@+id/gc_game_app_detail_iv2"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
+                        android:minHeight="100dp"
                         android:adjustViewBounds="true"
                         android:scaleType="fitXY"
                         android:src="@drawable/loading_01"
-                        android:visibility="gone" />
+                        android:visibility="gone"
+                        app:layout_constraintTop_toTopOf="parent" />
                     <com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
                         android:id="@+id/detail_player"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:minHeight="100dp"
-                        android:visibility="gone"/>
+                        android:visibility="gone"
+                        app:layout_constraintTop_toTopOf="parent"/>
                     <ImageView
                         android:layout_width="?attr/actionBarSize"
                         android:layout_height="?attr/actionBarSize"
@@ -82,7 +86,9 @@
                         android:gravity="center_vertical"
                         android:onClick="onClickBackImg"
                         android:scaleType="centerInside"
-                        android:src="@drawable/narrow_back_black" />
+                        android:src="@drawable/narrow_back_black"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
 
                     <ImageView
                         android:layout_width="?attr/actionBarSize"
@@ -92,7 +98,9 @@
                         android:gravity="center_vertical"
                         android:onClick="onClickShareImg"
                         android:scaleType="centerInside"
-                        android:src="@mipmap/share" />
+                        android:src="@mipmap/share"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"/>
 
                     <ImageView
                         android:id="@+id/gc_game_app_detail_play_iv"
@@ -100,9 +108,13 @@
                         android:layout_height="wrap_content"
                         android:layout_centerInParent="true"
                         android:src="@drawable/ic_play_but_image"
-                        android:visibility="gone" />
+                        android:visibility="gone"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintBottom_toBottomOf="parent"/>
 
-                </RelativeLayout>
+                </android.support.constraint.ConstraintLayout>
 
                 <android.support.constraint.ConstraintLayout
                     android:layout_width="match_parent"