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 0000000..b94a626 Binary files /dev/null and b/app/src/doc/xueshibaoos.jks differ diff --git a/app/src/main/java/com/uiui/videoplayer/CustomJzvd/JzvdStdAssert.java b/app/src/main/java/com/uiui/videoplayer/CustomJzvd/JzvdStdAssert.java index 96f6de1..ab360be 100644 --- a/app/src/main/java/com/uiui/videoplayer/CustomJzvd/JzvdStdAssert.java +++ b/app/src/main/java/com/uiui/videoplayer/CustomJzvd/JzvdStdAssert.java @@ -2,11 +2,16 @@ package com.uiui.videoplayer.CustomJzvd; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import cn.jzvd.JzvdStd; public class JzvdStdAssert extends JzvdStd { + private onVideoCompletionListener onVideoCompletionListener; + private ScreenOrientationChangeListener changeListener; + private GotoFullScreenListener gotoFullScreenListener; + public JzvdStdAssert(Context context) { super(context); } @@ -18,6 +23,7 @@ public class JzvdStdAssert extends JzvdStd { @Override public void onPrepared() { + Log.e("onStateChanged", "onPrepared"); state = STATE_PREPARED; if (!preloading) { mediaInterface.start(); @@ -26,9 +32,51 @@ public class JzvdStdAssert extends JzvdStd { onStatePlaying(); } + + @Override + public void onCompletion() { + super.onCompletion(); + onVideoCompletionListener.onVideoComplet(); + Log.e("onStateChanged", "onCompletion"); + } + + public void setOnCompletionListener(onVideoCompletionListener listener) { + this.onVideoCompletionListener = listener; + } + + public void setScreenOrientationChangeListener(ScreenOrientationChangeListener listener) { + this.changeListener = listener; + } + + public void setGotoFullScreenListener(GotoFullScreenListener listener) { + this.gotoFullScreenListener = listener; + } + + @Override + public void gotoNormalScreen() { + super.gotoNormalScreen(); + changeListener.onOrientationChange(); + } + @Override public void gotoFullscreen() { super.gotoFullscreen(); - + gotoFullScreenListener.onGotoFullScreen(); } + + //视频播放完成回调 + public interface onVideoCompletionListener { + void onVideoComplet(); + } + + //退出全屏回调 + public interface ScreenOrientationChangeListener { + void onOrientationChange(); + } + + //进入全屏回调 + public interface GotoFullScreenListener { + void onGotoFullScreen(); + } + } diff --git a/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java b/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java index 4c7d2f4..991c9c0 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java @@ -13,22 +13,20 @@ import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import com.uiui.videoplayer.CustomJzvd.JzvdStdAssert; -import com.uiui.videoplayer.CustomJzvd.JzvdStdTikTok; import com.uiui.videoplayer.R; import com.uiui.videoplayer.adapter.TikTokRecyclerViewAdapter; import com.uiui.videoplayer.base.ViewPagerLayoutManager; import com.uiui.videoplayer.listener.OnViewPagerListener; +import com.uiui.videoplayer.utils.ToastUtil; import java.util.ArrayList; import java.util.List; import cn.jzvd.Jzvd; -import cn.jzvd.JzvdStd; public class ActivityTikTok extends AppCompatActivity { @@ -40,6 +38,7 @@ public class ActivityTikTok extends AppCompatActivity { private int position = 0; private List 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'