提交 916f8d21 authored 作者: kongdywang's avatar kongdywang

Fix an issue where releasing the player would close the global Picture-in-Picture mode

上级 92d0fdf2
#### Version: 12.4.2 2025.04.30
##### Features:
- Fix an issue where releasing the player would close the global Picture-in-Picture mode.
#### Version: 12.4.1 2025.04.02 #### Version: 12.4.1 2025.04.02
##### Features: ##### Features:
......
...@@ -5,7 +5,7 @@ buildLog() { ...@@ -5,7 +5,7 @@ buildLog() {
} }
inputVersion=$1 inputVersion=$1
export VERSION_NAME="12.4.1" export VERSION_NAME="12.4.2"
if [ -n "$inputVersion" ]; then if [ -n "$inputVersion" ]; then
VERSION_NAME=$inputVersion VERSION_NAME=$inputVersion
fi fi
......
...@@ -4,7 +4,7 @@ rootProject.ext { ...@@ -4,7 +4,7 @@ rootProject.ext {
supportSdkVersion = "26.0.1" supportSdkVersion = "26.0.1"
minSdkVersion = 19 minSdkVersion = 19
targetSdkVersion = 28 targetSdkVersion = 28
playerVersion = "12.4.1" playerVersion = "12.4.2"
compat = "androidx.appcompat:appcompat:1.6.1" compat = "androidx.appcompat:appcompat:1.6.1"
/** /**
......
...@@ -125,15 +125,18 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber, FtxMessa ...@@ -125,15 +125,18 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber, FtxMessa
* *
* 通知退出当前pip * 通知退出当前pip
*/ */
public void exitPip() { public void exitCurrentPip() {
if (mIsInPipMode) { exitPipByPlayerId(-1);
final Activity curActivity = TXFlutterEngineHolder.getInstance().getCurActivity(); }
if (null != curActivity) {
Intent intent = new Intent(curActivity, FlutterPipImplActivity.class); /**
intent.setAction(FTXEvent.PIP_ACTION_EXIT); * @param playerId -1 is close anyway
curActivity.startActivity(intent); */
mIsInPipMode = false; public void exitPipByPlayerId(int playerId) {
} if (isInPipMode()) {
Bundle params = new Bundle();
params.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, playerId);
TXSimpleEventBus.getInstance().post(FTXEvent.PIP_ACTION_EXIT, params);
} }
} }
...@@ -238,14 +241,10 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber, FtxMessa ...@@ -238,14 +241,10 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber, FtxMessa
* 更新PIP悬浮框按钮 * 更新PIP悬浮框按钮
*/ */
public void updatePipActions(PipParams params) { public void updatePipActions(PipParams params) {
final Activity mAct = TXFlutterEngineHolder.getInstance().getCurActivity(); if (isInPipMode()) {
if (null != mAct) {
Intent intent = new Intent(mAct, FlutterPipImplActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable(FTXEvent.EXTRA_NAME_PARAMS, params); bundle.putParcelable(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.setAction(FTXEvent.PIP_ACTION_UPDATE); TXSimpleEventBus.getInstance().post(FTXEvent.PIP_ACTION_UPDATE, bundle);
intent.putExtra("data", bundle);
mAct.startActivity(intent);
} }
} }
......
...@@ -479,7 +479,7 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware, ...@@ -479,7 +479,7 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware,
} }
if (null != mTxPipManager) { if (null != mTxPipManager) {
mTxPipManager.releaseActivityListener(); mTxPipManager.releaseActivityListener();
mTxPipManager.exitPip(); mTxPipManager.exitCurrentPip();
} }
// Close the solution to the problem of the picture-in-picture click restore // Close the solution to the problem of the picture-in-picture click restore
// failure on some versions of Android 12. // failure on some versions of Android 12.
......
...@@ -393,7 +393,7 @@ public class FTXLivePlayer extends FTXLivePlayerRenderHost implements TXFlutterL ...@@ -393,7 +393,7 @@ public class FTXLivePlayer extends FTXLivePlayerRenderHost implements TXFlutterL
@Override @Override
public void exitPictureInPictureMode(@NonNull PlayerMsg playerMsg) { public void exitPictureInPictureMode(@NonNull PlayerMsg playerMsg) {
mPipManager.exitPip(); mPipManager.exitPipByPlayerId(getPlayerId());
} }
@NonNull @NonNull
......
...@@ -297,7 +297,7 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi ...@@ -297,7 +297,7 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi
result = mVodPlayer.stopPlay(isNeedClearLastImg); result = mVodPlayer.stopPlay(isNeedClearLastImg);
} }
mUIHandler.removeCallbacksAndMessages(null); mUIHandler.removeCallbacksAndMessages(null);
mPipManager.exitPip(); mPipManager.exitPipByPlayerId(getPlayerId());
releaseTXImageSprite(); releaseTXImageSprite();
mHardwareDecodeFail = false; mHardwareDecodeFail = false;
if (isNeedClearLastImg && null != mCurRenderView) { if (isNeedClearLastImg && null != mCurRenderView) {
...@@ -723,7 +723,7 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi ...@@ -723,7 +723,7 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi
@Override @Override
public void exitPictureInPictureMode(@NonNull PlayerMsg playerMsg) { public void exitPictureInPictureMode(@NonNull PlayerMsg playerMsg) {
mPipManager.exitPip(); mPipManager.exitPipByPlayerId(getPlayerId());
} }
@Override @Override
......
...@@ -4,6 +4,7 @@ import java.util.ArrayList; ...@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* use to communicate with Activities frequently * use to communicate with Activities frequently
...@@ -39,6 +40,16 @@ public class TXSimpleEventBus { ...@@ -39,6 +40,16 @@ public class TXSimpleEventBus {
} }
} }
public void unregisterAllType(EventSubscriber subscriber) {
Set<String> keySets = subscribers.keySet();
for (String key : keySets) {
List<EventSubscriber> subscriberList = subscribers.get(key);
if (subscriberList != null) {
subscriberList.remove(subscriber);
}
}
}
public void post(String eventType, Object data) { public void post(String eventType, Object data) {
List<EventSubscriber> subscriberList = subscribers.get(eventType); List<EventSubscriber> subscriberList = subscribers.get(eventType);
if (subscriberList != null) { if (subscriberList != null) {
......
...@@ -45,7 +45,7 @@ import com.tencent.vod.flutter.tools.TXSimpleEventBus; ...@@ -45,7 +45,7 @@ import com.tencent.vod.flutter.tools.TXSimpleEventBus;
public class FlutterPipImplActivity extends Activity implements ITXVodPlayListener, public class FlutterPipImplActivity extends Activity implements ITXVodPlayListener,
ServiceConnection { ServiceConnection, TXSimpleEventBus.EventSubscriber {
private static final String TAG = "FlutterPipImplActivity"; private static final String TAG = "FlutterPipImplActivity";
private static TXPlayerHolder pipPlayerHolder; private static TXPlayerHolder pipPlayerHolder;
...@@ -159,7 +159,7 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -159,7 +159,7 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
mPipContainer = findViewById(R.id.rl_pip_container); mPipContainer = findViewById(R.id.rl_pip_container);
if (null == pipPlayerHolder) { if (null == pipPlayerHolder) {
LiteavLog.e(TAG, "lack pipPlayerHolder, please check the pip argument"); LiteavLog.e(TAG, "lack pipPlayerHolder, please check the pip argument");
finish(); destroyPipAct();
return; return;
} }
mPlayerHolder = pipPlayerHolder; mPlayerHolder = pipPlayerHolder;
...@@ -169,15 +169,18 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -169,15 +169,18 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
setLivePlayerListener(); setLivePlayerListener();
} else { } else {
LiteavLog.e(TAG, "lack pipPlayerHolder player, please check the pip argument"); LiteavLog.e(TAG, "lack pipPlayerHolder player, please check the pip argument");
finish(); destroyPipAct();
return;
} }
TXSimpleEventBus.getInstance().register(FTXEvent.PIP_ACTION_EXIT, this);
TXSimpleEventBus.getInstance().register(FTXEvent.PIP_ACTION_UPDATE, this);
Intent intent = getIntent(); Intent intent = getIntent();
Bundle data = intent.getBundleExtra("data"); Bundle data = intent.getBundleExtra("data");
if (null != data) { if (null != data) {
PipParams params = data.getParcelable(FTXEvent.EXTRA_NAME_PARAMS); PipParams params = data.getParcelable(FTXEvent.EXTRA_NAME_PARAMS);
if (null == params) { if (null == params) {
LiteavLog.e(TAG, "lack pip params,please check the argument"); LiteavLog.e(TAG, "lack pip params,please check the argument");
finish(); destroyPipAct();
} else { } else {
mCurrentParams = params; mCurrentParams = params;
if (VERSION.SDK_INT >= VERSION_CODES.O) { if (VERSION.SDK_INT >= VERSION_CODES.O) {
...@@ -317,9 +320,11 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -317,9 +320,11 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
} }
if (null != mPlayerHolder.getVodPlayer()) { if (null != mPlayerHolder.getVodPlayer()) {
mPlayerHolder.getVodPlayer().setSurface(null); mPlayerHolder.getVodPlayer().setSurface(null);
mPlayerHolder.getVodPlayer().setVodListener(null);
} }
if (null != mPlayerHolder.getLivePlayer()) { if (null != mPlayerHolder.getLivePlayer()) {
mPlayerHolder.getLivePlayer().setRenderView((TextureView) null); mPlayerHolder.getLivePlayer().setRenderView((TextureView) null);
mPlayerHolder.getLivePlayer().setObserver(null);
} }
mPlayerHolder.pause(); mPlayerHolder.pause();
int codeEvent = mIsNeedToStop ? FTXEvent.EVENT_PIP_MODE_ALREADY_EXIT : FTXEvent.EVENT_PIP_MODE_RESTORE_UI; int codeEvent = mIsNeedToStop ? FTXEvent.EVENT_PIP_MODE_ALREADY_EXIT : FTXEvent.EVENT_PIP_MODE_RESTORE_UI;
...@@ -336,31 +341,48 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -336,31 +341,48 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
private void handleIntent(Intent intent) { private void handleIntent(Intent intent) {
if (intent != null) { if (intent != null) {
String action = intent.getAction(); String action = intent.getAction();
if (TextUtils.equals(action, FTXEvent.PIP_ACTION_START)) { handleAction(action, intent.getExtras());
startPipVideo(); }
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) { }
private void handleAction(String action, Bundle params) {
if (TextUtils.equals(action, FTXEvent.PIP_ACTION_START)) {
startPipVideo();
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) {
int playerId = -1;
if (null != params) {
playerId = params.getInt(FTXEvent.EXTRA_NAME_PLAYER_ID, -1);
}
if (playerId == -1 || playerId == mCurrentParams.getCurrentPlayerId()) {
mIsNeedToStop = true; mIsNeedToStop = true;
handlePipExitEvent(); handlePipExitEvent();
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) {
Bundle data = intent.getBundleExtra("data");
if (null != data) {
PipParams pipParams = data.getParcelable(FTXEvent.EXTRA_NAME_PARAMS);
updatePip(pipParams);
}
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_DO_EXIT)) {
overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
FlutterPipImplActivity.this.finishAndRemoveTask();
} else {
FlutterPipImplActivity.this.finish();
}
mIsPipFinishing = false;
} else { } else {
LiteavLog.e(TAG, "unknown pip action:" + action); LiteavLog.w(TAG, "close pip failed, playerId not found:" + playerId);
}
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) {
if (null != params) {
PipParams pipParams = params.getParcelable(FTXEvent.EXTRA_NAME_PARAMS);
updatePip(pipParams);
} }
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_DO_EXIT)) {
destroyPipAct();
} else {
LiteavLog.e(TAG, "unknown pip action:" + action);
} }
} }
private void destroyPipAct() {
overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
FlutterPipImplActivity.this.finishAndRemoveTask();
} else {
FlutterPipImplActivity.this.finish();
}
mIsPipFinishing = false;
pipPlayerHolder = null;
isInPip = false;
}
private void updatePip(PipParams pipParams) { private void updatePip(PipParams pipParams) {
if (null != pipParams && !isDestroyed() && !isFinishing()) { if (null != pipParams && !isDestroyed() && !isFinishing()) {
mCurrentParams = pipParams; mCurrentParams = pipParams;
...@@ -432,23 +454,11 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -432,23 +454,11 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
it can display back to the original page. it can display back to the original page.
*/ */
moveCurActToFront(); moveCurActToFront();
overridePendingTransition(0, 0); destroyPipAct();
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
FlutterPipImplActivity.this.finishAndRemoveTask();
} else {
FlutterPipImplActivity.this.finish();
}
mIsPipFinishing = false;
} }
}, 800); }, 800);
} else { } else {
overridePendingTransition(0, 0); destroyPipAct();
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
mIsPipFinishing = false;
} }
} }
} }
...@@ -487,6 +497,7 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -487,6 +497,7 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) {
unbindService(this); unbindService(this);
} }
TXSimpleEventBus.getInstance().unregister(FTXEvent.PIP_ACTION_EXIT, this);
mPlayerHolder = null; mPlayerHolder = null;
pipPlayerHolder = null; pipPlayerHolder = null;
isInPip = false; isInPip = false;
...@@ -650,4 +661,12 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen ...@@ -650,4 +661,12 @@ public class FlutterPipImplActivity extends Activity implements ITXVodPlayListen
@Override @Override
public void onServiceDisconnected(ComponentName name) { public void onServiceDisconnected(ComponentName name) {
} }
@Override
public void onEvent(String eventType, Object data) {
if (TextUtils.equals(FTXEvent.PIP_ACTION_EXIT, eventType)
|| TextUtils.equals(FTXEvent.PIP_ACTION_UPDATE, eventType)) {
handleAction(eventType, (Bundle) data);
}
}
} }
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# #
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'super_player' s.name = 'super_player'
s.version = '12.4.1' s.version = '12.4.2'
s.summary = 'The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand).' s.summary = 'The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand).'
s.description = <<-DESC s.description = <<-DESC
player plugin. player plugin.
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
part of SuperPlayer; part of SuperPlayer;
abstract class FPlayerPckInfo { abstract class FPlayerPckInfo {
static const String PLAYER_VERSION = "12.4.1"; static const String PLAYER_VERSION = "12.4.2";
} }
\ No newline at end of file
name: super_player name: super_player
description: The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand). description: The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand).
version: 12.4.1 version: 12.4.2
homepage: https://github.com/LiteAVSDK/Player_Flutter homepage: https://github.com/LiteAVSDK/Player_Flutter
environment: environment:
......
...@@ -3,5 +3,5 @@ part of demo_super_player_lib; ...@@ -3,5 +3,5 @@ part of demo_super_player_lib;
class PlayerConstants { class PlayerConstants {
static const PKG_NAME = "superplayer_widget"; static const PKG_NAME = "superplayer_widget";
static const String PLAYER_WIDGET_VERSION = "12.4.1"; static const String PLAYER_WIDGET_VERSION = "12.4.2";
} }
name: superplayer_widget name: superplayer_widget
description: superplayer,base on vodplayer description: superplayer,base on vodplayer
version: 12.4.1 version: 12.4.2
environment: environment:
sdk: '>=2.17.0 <4.0.0' sdk: '>=2.17.0 <4.0.0'
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论