From 9fa2b407d007d41ed6daa26f0bdf103341e93004 Mon Sep 17 00:00:00 2001 From: 21561 <215613905@qq.com> Date: Sun, 16 Mar 2025 21:56:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BB=8E=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=BB=A7=E7=BB=AD=E6=92=AD=E6=94=BE=E6=97=B6?= =?UTF-8?q?=E9=BB=91=E5=B1=8F=E7=9A=84bug;=20fix=20live=20bug;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tvbox/osc/player/IjkMediaPlayer.java | 1 - .../osc/ui/activity/LivePlayActivity.java | 42 ++++++++++-- gradle.properties | 2 +- .../doikki/videoplayer/player/VideoView.java | 67 +++++++++++++++++-- 4 files changed, 99 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java index 004890da..de1482cf 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java +++ b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java @@ -77,7 +77,6 @@ public class IjkMediaPlayer extends IjkPlayer { mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_CODEC, "threads", "2"); } // mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_PLAYER, "sync-av-start", 1);//强制音画同步 - mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1); } private static final String ITV_TARGET_DOMAIN = "gslbserv.itv.cmvideo.cn"; diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java index 53c884e0..8c5751b4 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java @@ -663,11 +663,14 @@ public class LivePlayActivity extends BaseActivity { mHandler.postDelayed(mPlaySelectedChannel, 2500); } + private final Handler mmHandler = new Handler(); + private Runnable mLongPressRunnable; + private static final long LONG_PRESS_DELAY = 800; @Override public boolean dispatchKeyEvent(KeyEvent event) { + int keyCode = event.getKeyCode(); if (event.getAction() == KeyEvent.ACTION_DOWN) { - int keyCode = event.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_MENU) { + if (keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_INFO || keyCode == KeyEvent.KEYCODE_HELP) { showSettingGroup(); } else if (!isListOrSettingLayoutVisible()) { switch (keyCode) { @@ -700,7 +703,6 @@ public class LivePlayActivity extends BaseActivity { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_ENTER: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: - showChannelList(); break; default: if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) { @@ -714,10 +716,40 @@ public class LivePlayActivity extends BaseActivity { } } } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (!isListOrSettingLayoutVisible()) { + if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) && event.getRepeatCount() == 0) { + showChannelList(); + } + } } return super.dispatchKeyEvent(event); } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) && event.getRepeatCount() == 0) { + mLongPressRunnable = new Runnable() { + @Override + public void run() { + showSettingGroup(); //实现长按调出菜单 + } + }; + mmHandler.postDelayed(mLongPressRunnable, LONG_PRESS_DELAY); + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { + if (mLongPressRunnable != null) { + mmHandler.removeCallbacks(mLongPressRunnable); + mLongPressRunnable = null; + } + } + return super.onKeyUp(keyCode, event); + } + @Override protected void onResume() { super.onResume(); @@ -938,6 +970,8 @@ public class LivePlayActivity extends BaseActivity { mVideoView.setUrl(currentLiveChannelItem.getUrl(),liveWebHeader()); mVideoView.start(); } +// liveChannelItemAdapter.setFocusedChannelIndex(currentLiveChannelIndex); + liveChannelItemAdapter.setSelectedChannelIndex(currentLiveChannelIndex); return true; } @@ -1564,11 +1598,11 @@ public class LivePlayActivity extends BaseActivity { private void clickLiveChannel(int position) { liveChannelItemAdapter.setSelectedChannelIndex(position); - playChannel(liveChannelGroupAdapter.getSelectedGroupIndex(), position, false); if (tvLeftChannelListLayout.getVisibility() == View.VISIBLE) { mHandler.removeCallbacks(mHideChannelListRun); mHandler.postDelayed(mHideChannelListRun, postTimeout); } + playChannel(liveChannelGroupAdapter.getSelectedGroupIndex(), position, false); } private void initSettingGroupView() { diff --git a/gradle.properties b/gradle.properties index 8e1f9a6b..2b801b14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,4 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true IsDebug=true -#org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED +org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED diff --git a/player/src/main/java/xyz/doikki/videoplayer/player/VideoView.java b/player/src/main/java/xyz/doikki/videoplayer/player/VideoView.java index 9f709c68..aa15aecd 100644 --- a/player/src/main/java/xyz/doikki/videoplayer/player/VideoView.java +++ b/player/src/main/java/xyz/doikki/videoplayer/player/VideoView.java @@ -13,6 +13,9 @@ import android.os.Parcelable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -346,14 +349,64 @@ public class VideoView

extends FrameLayout * 继续播放 */ public void resume() { - if (isInPlaybackState() - && !mMediaPlayer.isPlaying()) { - mMediaPlayer.start(); - setPlayState(STATE_PLAYING); - if (mAudioFocusHelper != null && !isMute()) { - mAudioFocusHelper.requestFocus(); + if (isInPlaybackState() && !mMediaPlayer.isPlaying()) { + addDisplay(); + if (mRenderView != null) { + mRenderView.setScaleType(mCurrentScreenScaleType); + mRenderView.setVideoSize(mVideoSize[0], mVideoSize[1]); + } + assert mRenderView != null; + View renderView = mRenderView.getView(); + if (renderView instanceof SurfaceView) { + final SurfaceView surfaceView = (SurfaceView) renderView; + final SurfaceHolder holder = surfaceView.getHolder(); + if (holder.getSurface() != null && holder.getSurface().isValid()) { + mMediaPlayer.setDisplay(holder); + mMediaPlayer.start(); + setPlayState(STATE_PLAYING); + if (mAudioFocusHelper != null && !isMute()) { + mAudioFocusHelper.requestFocus(); + } + mPlayerContainer.setKeepScreenOn(true); + } else { + holder.addCallback(new SurfaceHolder.Callback() { + @Override + public void surfaceCreated(SurfaceHolder holder) { + mMediaPlayer.setDisplay(holder); + mMediaPlayer.start(); + setPlayState(STATE_PLAYING); + if (mAudioFocusHelper != null && !isMute()) { + mAudioFocusHelper.requestFocus(); + } + mPlayerContainer.setKeepScreenOn(true); + // 记得移除回调,避免重复调用 + holder.removeCallback(this); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + } + }); + } + } else if (renderView instanceof TextureView) { + mMediaPlayer.start(); + setPlayState(STATE_PLAYING); + if (mAudioFocusHelper != null && !isMute()) { + mAudioFocusHelper.requestFocus(); + } + mPlayerContainer.setKeepScreenOn(true); + } else { + mMediaPlayer.start(); + setPlayState(STATE_PLAYING); + if (mAudioFocusHelper != null && !isMute()) { + mAudioFocusHelper.requestFocus(); + } + mPlayerContainer.setKeepScreenOn(true); } - mPlayerContainer.setKeepScreenOn(true); } }