From 2392d26b580752911326e26d169b71c878fef617 Mon Sep 17 00:00:00 2001 From: Administrator <981964879@qq.com> Date: Tue, 2 Mar 2021 10:19:37 +0800 Subject: [PATCH] =?UTF-8?q?version:=20update:=E6=9B=B4=E6=94=B9app?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8C=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=87=AA=E5=8A=A8=E6=92=AD=E6=94=BE=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=EF=BC=8C=E6=89=80=E6=9C=89=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E9=80=80=E5=87=BA=E6=92=AD=E6=94=BE=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=85=A8=E5=B1=8F=E9=80=80?= =?UTF-8?q?=E5=87=BA=E6=97=B6=E6=A0=B9=E6=8D=AE=E6=96=B9=E5=90=91=E6=97=8B?= =?UTF-8?q?=E8=BD=AC=E5=B1=8F=E5=B9=95=E3=80=82=20fix=20bug:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 31 +++++- app/src/doc/xueshibaoos.jks | Bin 0 -> 2552 bytes .../videoplayer/CustomJzvd/JzvdStdAssert.java | 50 +++++++++- .../videoplayer/activity/ActivityTikTok.java | 81 +++++++++------- .../adapter/TikTokRecyclerViewAdapter.java | 90 +++++++++++++++++- app/src/main/res/values/strings.xml | 2 +- .../src/main/java/cn/jzvd/JZDataSource.java | 2 +- library/src/main/java/cn/jzvd/Jzvd.java | 3 +- settings.gradle | 2 +- 9 files changed, 220 insertions(+), 41 deletions(-) create mode 100644 app/src/doc/xueshibaoos.jks diff --git a/app/build.gradle b/app/build.gradle index a6061ba..14b95ec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,11 +18,40 @@ android { // add support lib abiFilters 'armeabi-v7a' //, 'arm64-v8a'//, "mips" //,'armeabi''x86',, 'x86_64', } - } + lintOptions { + checkReleaseBuilds false + abortOnError false + } + } + //签名 + signingConfigs { + debug { + storeFile file("src/doc/xueshibaoos.jks") + storePassword "123456" + keyAlias "xueshibaoos" + keyPassword "123456" + v2SigningEnabled false + } + release {// 签名文件 + storeFile file("src/doc/xueshibaoos.jks") + storePassword "123456" + keyAlias "xueshibaoos" + keyPassword "123456" + v2SigningEnabled false + } + } buildTypes { release { minifyEnabled false + zipAlignEnabled true + signingConfig signingConfigs.release + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled false + zipAlignEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/app/src/doc/xueshibaoos.jks b/app/src/doc/xueshibaoos.jks new file mode 100644 index 0000000000000000000000000000000000000000..b94a626a1e59b41e0d2b0e1725c1d164b6a8f5ab GIT binary patch literal 2552 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 h=~IOHotm-=tG={6OY~?wV#1*=AWE videoPath = new ArrayList<>(); private int onGlobalLayout = -1; + private int oldOrientation = 0; @Override protected void onCreate(Bundle savedInstanceState) { @@ -49,15 +48,40 @@ public class ActivityTikTok extends AppCompatActivity { WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_tiktok); + Configuration config = getResources().getConfiguration(); + oldOrientation = config.orientation; + Log.e(TAG, "orientation first:" + oldOrientation); + Intent intent = getIntent(); if (null != intent) { position = intent.getIntExtra("position", 0); - Log.e(TAG, "position: " + position); videoPath = intent.getStringArrayListExtra("list"); } rvTiktok = findViewById(R.id.rv_tiktok); - mAdapter = new TikTokRecyclerViewAdapter(this, videoPath); + mAdapter.setVideoCompletListener(() -> { + if (mCurrentPosition + 1 < videoPath.size()) { + rvTiktok.smoothScrollToPosition(mCurrentPosition + 1); + } else { + ToastUtil.show("播放完成"); + finish(); + } + }); + mAdapter.setOrientationChangeListener(new TikTokRecyclerViewAdapter.onOrientationChangeListener() { + @Override + public void onOrientationChange() { + Configuration config = getResources().getConfiguration(); + Log.e(TAG, "orientation onOrientationChange:" + config.orientation); + } + }); + mAdapter.setGotoFullScreenListener(new TikTokRecyclerViewAdapter.onGotoFullScreenListener() { + @Override + public void gotoFullScreen() { + Configuration config = getResources().getConfiguration(); + oldOrientation = config.orientation; + Log.e(TAG, "orientation gotoFullScreen:" + config.orientation); + } + }); mViewPagerLayoutManager = new ViewPagerLayoutManager(this, OrientationHelper.VERTICAL); rvTiktok.setLayoutManager(mViewPagerLayoutManager); rvTiktok.setNestedScrollingEnabled(false); @@ -76,8 +100,7 @@ public class ActivityTikTok extends AppCompatActivity { @Override public void onInitComplete() { //自动播放第一条 - Log.e(TAG, "autoPlayVideo: " + "onInitComplete"); - autoPlayVideo(position); + autoPlayVideo(); } @Override @@ -92,8 +115,7 @@ public class ActivityTikTok extends AppCompatActivity { if (mCurrentPosition == position) { return; } - Log.e(TAG, "autoPlayVideo: " + "onPageSelected"); - autoPlayVideo(position); + autoPlayVideo(); mCurrentPosition = position; } }); @@ -121,6 +143,19 @@ public class ActivityTikTok extends AppCompatActivity { public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); Configuration config = getResources().getConfiguration(); + if (oldOrientation != config.orientation) { + if (oldOrientation == Configuration.ORIENTATION_LANDSCAPE) { + // 设为竖屏 + this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + oldOrientation = Configuration.ORIENTATION_LANDSCAPE; + } + // 如果当前是竖屏 + if (oldOrientation == Configuration.ORIENTATION_PORTRAIT) { + // 设为横屏 + this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + oldOrientation = Configuration.ORIENTATION_PORTRAIT; + } + } // 如果当前是横屏 // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { // // 设为竖屏 @@ -133,37 +168,15 @@ public class ActivityTikTok extends AppCompatActivity { // this.setRequestedOrientation( // ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // } + Log.e(TAG, "orientation oldOrientation:" + config.orientation); + Log.e(TAG, "orientation: " + config.orientation); } - /** - * RecyclerView 移动到当前位置, - * - * @param manager 设置RecyclerView对应的manager - * @param mRecyclerView 当前的RecyclerView - * @param n 要跳转的位置 - */ - public static void MoveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int n) { - - - int firstItem = manager.findFirstVisibleItemPosition(); - int lastItem = manager.findLastVisibleItemPosition(); - if (n <= firstItem) { - mRecyclerView.scrollToPosition(n); - } else if (n <= lastItem) { - int top = mRecyclerView.getChildAt(n - firstItem).getTop(); - mRecyclerView.scrollBy(0, top); - } else { - mRecyclerView.scrollToPosition(n); - } - - } - - private void autoPlayVideo(int postion) { + private void autoPlayVideo() { // mViewPagerLayoutManager.scrollToPositionWithOffset(postion, 0); View child = rvTiktok.getChildAt(0); if (rvTiktok == null || child == null) { - Log.e(TAG, "autoPlayVideo: " + "view is null"); return; } JzvdStdAssert player = rvTiktok.getChildAt(0).findViewById(R.id.videoplayer); diff --git a/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java b/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java index 513f9f3..e184bcb 100644 --- a/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java +++ b/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java @@ -2,27 +2,43 @@ package com.uiui.videoplayer.adapter; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Bitmap; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.Toast; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; import com.uiui.videoplayer.CustomJzvd.JzvdStdAssert; import com.uiui.videoplayer.R; +import com.uiui.videoplayer.utils.Utils; import java.util.List; import cn.jzvd.JZDataSource; import cn.jzvd.Jzvd; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import wseemann.media.FFmpegMediaMetadataRetriever; public class TikTokRecyclerViewAdapter extends RecyclerView.Adapter { public static final String TAG = "AdapterTikTokRecyclerView"; private List videoPath; private Context context; + private onVideoCompletListener completListener; + private onOrientationChangeListener onOrientationChangeListener; + private onGotoFullScreenListener gotoFullScreenListener; public TikTokRecyclerViewAdapter(Context context) { this.context = context; @@ -33,6 +49,29 @@ public class TikTokRecyclerViewAdapter extends RecyclerView.Adapter视频播放器 + 快易播放器 diff --git a/library/src/main/java/cn/jzvd/JZDataSource.java b/library/src/main/java/cn/jzvd/JZDataSource.java index 9fcad12..719c40d 100644 --- a/library/src/main/java/cn/jzvd/JZDataSource.java +++ b/library/src/main/java/cn/jzvd/JZDataSource.java @@ -11,7 +11,7 @@ public class JZDataSource { public LinkedHashMap urlsMap = new LinkedHashMap(); public String title = ""; public HashMap headerMap = new HashMap<>(); - public boolean looping = false; + public boolean looping = false;//循环播放 public Object[] objects; public JZDataSource(String url) { diff --git a/library/src/main/java/cn/jzvd/Jzvd.java b/library/src/main/java/cn/jzvd/Jzvd.java index 2b7ad44..d5f6db8 100644 --- a/library/src/main/java/cn/jzvd/Jzvd.java +++ b/library/src/main/java/cn/jzvd/Jzvd.java @@ -60,6 +60,7 @@ public abstract class Jzvd extends FrameLayout implements View.OnClickListener, public static boolean TOOL_BAR_EXIST = true; public static int FULLSCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; public static int NORMAL_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; + public static int NORMAL_SENSOR= ActivityInfo.SCREEN_ORIENTATION_SENSOR; public static boolean SAVE_PROGRESS = true; public static boolean WIFI_TIP_DIALOG_SHOWED = false; public static int VIDEO_IMAGE_DISPLAY_TYPE = 0; @@ -1013,7 +1014,7 @@ public abstract class Jzvd extends FrameLayout implements View.OnClickListener, setScreenNormal();//这块可以放到jzvd中 JZUtils.showStatusBar(jzvdContext); - JZUtils.setRequestedOrientation(jzvdContext, NORMAL_ORIENTATION); + JZUtils.setRequestedOrientation(jzvdContext, NORMAL_SENSOR); JZUtils.showSystemUI(jzvdContext); } diff --git a/settings.gradle b/settings.gradle index 4b8a0ba..81ab69e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name='视频播放器' +rootProject.name='快易播放器' include ':app', ':library'