提交 962cc2de 编写于 作者: G guoshuyu

Merge remote-tracking branch 'origin/master'

......@@ -4,8 +4,8 @@ android:
components:
- platform-tools
- tools
- build-tools-26.0.2
- android-26
- build-tools-27.0.2
- android-27
- extra-android-support
- extra-android-m2repository
......@@ -14,4 +14,4 @@ before_install:
script:
- cd gsyVideoPlayer
- ../gradlew assembleRelease
\ No newline at end of file
- ../gradlew assembleRelease
......@@ -133,6 +133,15 @@ compile 'com.shuyu:gsyVideoPlayer-ex_so:4.1.2'
### 4.1.3(2018-xx-xx 未发布)
* 优化单双击
* update support and build sdk to 27
* 增加是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效。
```
/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
* @param autoFullWithSize 默认false
*/
public void setAutoFullWithSize(boolean autoFullWithSize)
```
### 4.1.2(2018-04-14)
* 修复已知问题。
......
......@@ -2,6 +2,7 @@ package com.example.gsyvideoplayer;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
......@@ -12,6 +13,8 @@ import com.example.gsyvideoplayer.video.LandLayoutVideo;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
import com.shuyu.gsyvideoplayer.listener.GSYVideoProgressListener;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.utils.FileUtils;
import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
......@@ -20,8 +23,12 @@ import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
public class DetailPlayer extends AppCompatActivity {
......@@ -55,7 +62,13 @@ public class DetailPlayer extends AppCompatActivity {
//断网自动重新链接,url前接上ijkhttphook:
//String url = "ijkhttphook:https://res.exexm.com/cw_145225549855002";
String url = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
//String url = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
//String url = "http://qiniu.carmmi.com/image/132451525666042.mp4";
String url = "http://7xse1z.com1.z0.glb.clouddn.com/1491813192";
//String url = "file://"+ Environment.getExternalStorageDirectory().getPath() + "Download/132451525666042.mp4";
//String url = "http://ipsimg-huabei2.speiyou.cn/010/video/other/20180427/40288b156241ec6301624243bdf7021e/40288b156290270d0162a3e7eb2e0726/1524814477/movie.mp4";
//String url = "http://ipsimg-huabei2.speiyou.cn/010/video/other/20180424/40288b156290270d0162a3db8cdd033e/40288b156290270d0162a3e8207f074f/e787a64c-f2d0-48fe-896d-246af05f111a.mp4";
//String url = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
//String url = "http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8";
......@@ -87,10 +100,10 @@ public class DetailPlayer extends AppCompatActivity {
//detailPlayer.setShowPauseCover(false);
//如果视频帧数太高导致卡画面不同步
//VideoOptionModel videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);
//VideoOptionModel videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 30);
//如果视频seek之后从头播放
//VideoOptionModel videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
//List<VideoOptionModel> list = new ArrayList<>();
//list<VideoOptionModel> list = new ArrayList<>();
//list.add(videoOptionModel);
//GSYVideoManager.instance().setOptionModelList(list);
......@@ -115,9 +128,9 @@ public class DetailPlayer extends AppCompatActivity {
.setIsTouchWiget(true)
.setRotateViewAuto(false)
.setLockLand(false)
.setAutoFullWithSize(true)
.setShowFullAnimation(false)
.setNeedLockFull(true)
.setSeekRatio(1)
.setUrl(url)
.setCacheWithPlay(false)
.setVideoTitle("测试视频")
......
......@@ -11,6 +11,7 @@ import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.bumptech.glide.Glide;
import com.example.gsyvideoplayer.video.LandLayoutVideo;
import com.example.gsyvideoplayer.view.CustomInputDialog;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
......@@ -127,6 +128,18 @@ public class InputUrlDetailActivity extends AppCompatActivity {
}
});
detailPlayer.postDelayed(new Runnable() {
@Override
public void run() {
ImageView testImage = findViewById(R.id.test_image_view);
Glide.with(InputUrlDetailActivity.this.getApplicationContext())
.load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1525708180755&di=078af5aedf4b44268425be46bf25e407&imgtype=0&src=http%3A%2F%2Fc.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F203fb80e7bec54e78494e3a3bb389b504fc26a17.jpg")
.into(testImage);
}
}, 5000);
}
@Override
......
package com.example.gsyvideoplayer;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.gsyvideoplayer.utils.JumpUtils;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
......@@ -12,6 +16,8 @@ import com.shuyu.gsyvideoplayer.utils.Debuger;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import permissions.dispatcher.PermissionUtils;
import permissions.dispatcher.RuntimePermissions;
public class MainActivity extends AppCompatActivity {
......@@ -21,12 +27,28 @@ public class MainActivity extends AppCompatActivity {
@BindView(R.id.open_btn_empty)
Button openBtn2;
final String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Debuger.enable();
ButterKnife.bind(this);
boolean hadPermission = PermissionUtils.hasSelfPermissions(this, permissions);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !hadPermission) {
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, 1110);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean sdPermissionResult = PermissionUtils.verifyPermissions(grantResults);
if (!sdPermissionResult) {
Toast.makeText(this, "没获取到sd卡权限,无法播放本地视频哦", Toast.LENGTH_LONG).show();
}
}
@OnClick({R.id.open_btn, R.id.list_btn, R.id.list_btn_2, R.id.list_detail, R.id.clear_cache, R.id.recycler, R.id.recycler_2, R.id.list_detail_list, R.id.web_detail, R.id.danmaku_video, R.id.fragment_video,
......
......@@ -137,6 +137,7 @@ public class RecyclerView2Activity extends AppCompatActivity {
.setHideStatusBar(true)
.setNeedLockFull(true)
.setCacheWithPlay(true)
.setAutoFullWithSize(true)
.setShowFullAnimation(true)
.setLockLand(true).setVideoAllCallBack(new GSYSampleCallBack() {
@Override
......
......@@ -79,8 +79,9 @@ public class ListNormalAdapter extends BaseAdapter {
//final String url = "https://res.exexm.com/cw_145225549855002";
final String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
//final String url = "http://7xse1z.com1.z0.glb.clouddn.com/1491813192";
final String urlH = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlV = "http://7xse1z.com1.z0.glb.clouddn.com/1491813192";
final String url = (position % 2 == 0) ? urlH : urlV;
//final String url = "http://111.198.24.133:83/yyy_login_server/pic/YB059284/97778276040859/1.mp4";
......@@ -95,7 +96,7 @@ public class ListNormalAdapter extends BaseAdapter {
//默认缓存路径
//使用lazy的set可以避免滑动卡的情况存在
holder.gsyVideoPlayer.setUpLazy(url, true, null, null, "这是title");
holder.gsyVideoPlayer.setUpLazy(url, false, null, null, "这是title");
//holder.gsyVideoPlayer.setNeedShowWifiTip(false);
......@@ -148,6 +149,7 @@ public class ListNormalAdapter extends BaseAdapter {
holder.gsyVideoPlayer.setRotateViewAuto(!getListNeedAutoLand());
holder.gsyVideoPlayer.setLockLand(!getListNeedAutoLand());
holder.gsyVideoPlayer.setPlayTag(TAG);
holder.gsyVideoPlayer.setAutoFullWithSize(true);
holder.gsyVideoPlayer.setReleaseWhenLossAudio(false);
holder.gsyVideoPlayer.setShowFullAnimation(!getListNeedAutoLand());
holder.gsyVideoPlayer.setIsTouchWiget(false);
......@@ -247,7 +249,7 @@ public class ListNormalAdapter extends BaseAdapter {
* @return 返回true为支持列表重力全屏
*/
public boolean getListNeedAutoLand() {
return true;
return false;
}
private void initOrientationUtils(StandardGSYVideoPlayer standardGSYVideoPlayer, boolean full) {
......
......@@ -68,6 +68,7 @@ class FloatToast extends FloatView {
private void initTN() {
try {
//todo android P test
Field tnField = toast.getClass().getDeclaredField("mTN");
tnField.setAccessible(true);
mTN = tnField.get(toast);
......
......@@ -35,6 +35,15 @@
android:layout_height="@dimen/post_media_height" />
<ImageView
android:id="@+id/test_image_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="10dp"
android:src="@mipmap/ic_launcher" />
<Button
android:id="@+id/inputUrl"
android:layout_width="wrap_content"
......@@ -42,7 +51,6 @@
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="10dp"
android:text="切换url"
/>
android:text="切换url" />
</RelativeLayout>
......@@ -12,7 +12,7 @@
<style name="Theme.AppCompat.Translucent" parent="AppTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
......
......@@ -124,7 +124,7 @@ public abstract class GSYBaseActivityDetail<T extends GSYBaseVideoPlayer> extend
throw new NullPointerException("initVideo() or initVideoBuilderMode() first");
}
//开始播放了才能旋转和全屏
orientationUtils.setEnable(getDetailOrientationRotateAuto());
orientationUtils.setEnable(getDetailOrientationRotateAuto() && !isAutoFullWithSize());
isPlay = true;
}
......@@ -257,4 +257,11 @@ public abstract class GSYBaseActivityDetail<T extends GSYBaseVideoPlayer> extend
* 是否启动旋转横屏,true表示启动
*/
public abstract boolean getDetailOrientationRotateAuto();
/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
*/
public boolean isAutoFullWithSize() {
return false;
}
}
......@@ -59,6 +59,9 @@ public class GSYVideoOptionBuilder {
//是否使用全屏动画效果
protected boolean mShowFullAnimation = true;
//是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
protected boolean mAutoFullWithSize = false;
//是否需要显示流量提示
protected boolean mNeedShowWifiTip = true;
......@@ -156,6 +159,16 @@ public class GSYVideoOptionBuilder {
protected GSYVideoProgressListener mGSYVideoProgressListener;
/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
*
* @param autoFullWithSize 默认false
*/
public GSYVideoOptionBuilder setAutoFullWithSize(boolean autoFullWithSize) {
this.mAutoFullWithSize = autoFullWithSize;
return this;
}
/**
* 全屏动画
*
......@@ -585,6 +598,7 @@ public class GSYVideoOptionBuilder {
if (mGSYVideoProgressListener != null) {
gsyVideoPlayer.setGSYVideoProgressListener(mGSYVideoProgressListener);
}
gsyVideoPlayer.setAutoFullWithSize(mAutoFullWithSize);
gsyVideoPlayer.setRotateViewAuto(mRotateViewAuto);
gsyVideoPlayer.setLockLand(mLockLand);
gsyVideoPlayer.setSpeed(mSpeed, mSounchTouch);
......
......@@ -21,9 +21,12 @@ public class OrientationUtils {
private int screenType = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
private int mIsLand;
private boolean mClick, mClickLand, mClickPort;
private boolean mClick = false;
private boolean mClickLand = false;
private boolean mClickPort;
private boolean mEnable = true;
private boolean mRotateWithSystem = true; //是否跟随系统
//是否跟随系统
private boolean mRotateWithSystem = true;
/**
* @param activity
......@@ -41,9 +44,10 @@ public class OrientationUtils {
public void onOrientationChanged(int rotation) {
boolean autoRotateOn = (Settings.System.getInt(activity.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 1);
if (!autoRotateOn && mRotateWithSystem) {
//if (mIsLand == 0) {
return;
//}
return;
}
if (gsyVideoPlayer != null && gsyVideoPlayer.isVerticalFullByVideoSize()) {
return;
}
// 设置竖屏
if (((rotation >= 0) && (rotation <= 30)) || (rotation >= 330)) {
......@@ -122,6 +126,9 @@ public class OrientationUtils {
* 点击切换的逻辑,比如竖屏的时候点击了就是切换到横屏不会受屏幕的影响
*/
public void resolveByClick() {
if (mIsLand == 0 && gsyVideoPlayer != null && gsyVideoPlayer.isVerticalFullByVideoSize()) {
return;
}
mClick = true;
if (mIsLand == 0) {
screenType = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
......@@ -231,6 +238,7 @@ public class OrientationUtils {
/**
* 是否更新系统旋转,false的话,系统禁止旋转也会跟着旋转
*
* @param rotateWithSystem 默认true
*/
public void setRotateWithSystem(boolean rotateWithSystem) {
......
......@@ -22,6 +22,8 @@ import com.transitionseverywhere.TransitionManager;
import java.lang.reflect.Constructor;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getActionBarHeight;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getStatusBarHeight;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.hideNavKey;
......@@ -63,6 +65,9 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
//当前全屏是否锁定全屏
protected boolean mLockLand = false;
//是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
protected boolean mAutoFullWithSize = false;
//小窗口关闭按键
protected View mSmallClose;
......@@ -139,13 +144,28 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
super.lockTouchLogic();
if (mLockCurScreen) {
if (mOrientationUtils != null)
mOrientationUtils.setEnable(mRotateViewAuto);
mOrientationUtils.setEnable(isRotateViewAuto());
} else {
if (mOrientationUtils != null)
mOrientationUtils.setEnable(false);
}
}
@Override
public void onPrepared() {
super.onPrepared();
//确保开启竖屏检测的时候正常全屏
checkAutoFullSizeWhenFull();
}
@Override
public void onInfo(int what, int extra) {
super.onInfo(what, extra);
if (what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED) {
checkAutoFullSizeWhenFull();
}
}
private ViewGroup getViewGroup() {
return (ViewGroup) (CommonUtil.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
......@@ -216,6 +236,7 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
to.mVideoAllCallBack = from.mVideoAllCallBack;
to.mActionBar = from.mActionBar;
to.mStatusBar = from.mStatusBar;
to.mAutoFullWithSize = from.mAutoFullWithSize;
if (from.mSetUpLazy) {
to.setUpLazy(from.mOriginUrl, from.mCache, from.mCachePath, from.mMapHeadData, from.mTitle);
to.mUrl = from.mUrl;
......@@ -278,15 +299,20 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
gsyVideoPlayer.setLayoutParams(lp);
gsyVideoPlayer.setIfCurrentIsFullscreen(true);
mOrientationUtils = new OrientationUtils((Activity) context, gsyVideoPlayer);
mOrientationUtils.setEnable(mRotateViewAuto);
mOrientationUtils.setEnable(isRotateViewAuto());
mOrientationUtils.setRotateWithSystem(mRotateWithSystem);
gsyVideoPlayer.mOrientationUtils = mOrientationUtils;
final boolean isVertical = isVerticalFullByVideoSize();
final boolean isLockLand = isLockLandByAutoFullSize();
if (isShowFullAnimation()) {
postDelayed(new Runnable() {
@Override
public void run() {
if (mLockLand && mOrientationUtils.getIsLand() != 1) {
Debuger.printfLog("GSYVideoBase resolveFullVideoShow isVerticalFullByVideoSize " + isVertical);
//autoFull模式下,非横屏视频视频不横屏,并且不自动旋转
if (!isVertical && isLockLand && mOrientationUtils.getIsLand() != 1) {
mOrientationUtils.resolveByClick();
}
gsyVideoPlayer.setVisibility(VISIBLE);
......@@ -294,7 +320,7 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
}
}, 300);
} else {
if (mLockLand) {
if (!isVertical && isLockLand) {
mOrientationUtils.resolveByClick();
}
gsyVideoPlayer.setVisibility(VISIBLE);
......@@ -441,12 +467,64 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
postDelayed(mCheckoutTask, 500);
}
/**
* 是否竖屏模式的竖屏
*/
protected boolean isVerticalVideo() {
boolean isVertical = false;
int videoHeight = getCurrentVideoHeight();
int videoWidth = getCurrentVideoWidth();
Debuger.printfLog("GSYVideoBase isVerticalVideo videoHeight " + videoHeight + " videoWidth " + videoWidth);
Debuger.printfLog("GSYVideoBase isVerticalVideo mRotate " + mRotate);
if (videoHeight > 0 && videoWidth > 0) {
if (mRotate == 90 || mRotate == 270) {
isVertical = videoWidth > videoHeight;
} else {
isVertical = videoHeight > videoWidth;
}
}
return isVertical;
}
/**
* 是否根据autoFullSize调整lockLand
*/
protected boolean isLockLandByAutoFullSize() {
boolean isLockLand = mLockLand;
if (isAutoFullWithSize()) {
isLockLand = true;
}
return isLockLand;
}
/**
* 确保开启竖屏检测的时候正常全屏
*/
protected void checkAutoFullSizeWhenFull() {
if (mIfCurrentIsFullscreen) {
//确保开启竖屏检测的时候正常全屏
boolean isV = isVerticalFullByVideoSize();
Debuger.printfLog("GSYVideoBase onPrepared isVerticalFullByVideoSize " + isV);
if (isV) {
if (mOrientationUtils != null)
mOrientationUtils.backToProtVideo();
}
}
}
protected abstract int getFullId();
protected abstract int getSmallId();
/************************* 开放接口 *************************/
/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
*/
public boolean isVerticalFullByVideoSize() {
return isVerticalVideo() && isAutoFullWithSize();
}
/**
* 旋转处理
*
......@@ -477,7 +555,7 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
}
} else {
//新版本isIfCurrentIsFullscreen的标志位内部提前设置了,所以不会和手动点击冲突
if (isIfCurrentIsFullscreen()) {
if (isIfCurrentIsFullscreen() && isVerticalFullByVideoSize()) {
backFromFull(activity);
}
if (orientationUtils != null) {
......@@ -722,6 +800,9 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
}
public boolean isRotateViewAuto() {
if (mAutoFullWithSize) {
return false;
}
return mRotateViewAuto;
}
......@@ -836,4 +917,16 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
public void setSaveBeforeFullSystemUiVisibility(int systemUiVisibility) {
this.mSystemUiVisibility = systemUiVisibility;
}
public boolean isAutoFullWithSize() {
return mAutoFullWithSize;
}
/**
* 是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏,注意,这时候默认旋转无效
* @param autoFullWithSize 默认false
*/
public void setAutoFullWithSize(boolean autoFullWithSize) {
this.mAutoFullWithSize = autoFullWithSize;
}
}
......@@ -1133,4 +1133,18 @@ public abstract class GSYVideoView extends GSYTextureRenderView implements GSYMe
public void setReleaseWhenLossAudio(boolean releaseWhenLossAudio) {
this.mReleaseWhenLossAudio = releaseWhenLossAudio;
}
public Map<String, String> getMapHeadData() {
return mMapHeadData;
}
/**
* 单独设置mapHeader
* @param headData
*/
public void setMapHeadData(Map<String, String> headData) {
if (headData != null) {
this.mMapHeadData = headData;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册