提交 2711c048 authored 作者: kongdywang's avatar kongdywang

fix ios pip pause UI error

上级 d8f8b1cd
...@@ -26,7 +26,7 @@ import java.util.HashMap; ...@@ -26,7 +26,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import io.flutter.Log; import android.util.Log;
import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.FlutterPlugin;
/** /**
...@@ -35,11 +35,11 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin; ...@@ -35,11 +35,11 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin;
public class FTXPIPManager { public class FTXPIPManager {
private final static String TAG = "FTXPIPManager"; private final static String TAG = "FTXPIPManager";
private boolean isRegisterReceiver = false; private boolean isRegisterReceiver = false;
private final Map<Integer, PipCallback> pipCallbacks = new HashMap<>(); private final Map<Integer, PipCallback> pipCallbacks = new HashMap<>();
FTXAudioManager mTxAudioManager; FTXAudioManager mTxAudioManager;
private Activity mActivity; private Activity mActivity;
private FlutterPlugin.FlutterAssets mFlutterAssets; private FlutterPlugin.FlutterAssets mFlutterAssets;
private final BroadcastReceiver pipActionReceiver = new BroadcastReceiver() { private final BroadcastReceiver pipActionReceiver = new BroadcastReceiver() {
...@@ -66,8 +66,8 @@ public class FTXPIPManager { ...@@ -66,8 +66,8 @@ public class FTXPIPManager {
/** /**
* @param mTxAudioManager 音频管理,用于画中画模式下请求音频焦点 * @param mTxAudioManager 音频管理,用于画中画模式下请求音频焦点
* @param mActivity activity * @param mActivity activity
* @param flutterAssets flutter资源管理 * @param flutterAssets flutter资源管理
*/ */
public FTXPIPManager(FTXAudioManager mTxAudioManager, public FTXPIPManager(FTXAudioManager mTxAudioManager,
Activity mActivity, FlutterPlugin.FlutterAssets flutterAssets) { Activity mActivity, FlutterPlugin.FlutterAssets flutterAssets) {
...@@ -112,7 +112,7 @@ public class FTXPIPManager { ...@@ -112,7 +112,7 @@ public class FTXPIPManager {
params.mPipParams = new PictureInPictureParams.Builder(); params.mPipParams = new PictureInPictureParams.Builder();
updatePipActions(isPlaying, params); updatePipActions(isPlaying, params);
boolean enterResult = mActivity.enterPictureInPictureMode(params.mPipParams.build()); boolean enterResult = mActivity.enterPictureInPictureMode(params.mPipParams.build());
if(!enterResult) { if (!enterResult) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION; pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION;
} }
} else { } else {
...@@ -133,7 +133,7 @@ public class FTXPIPManager { ...@@ -133,7 +133,7 @@ public class FTXPIPManager {
if (!isSuccess) { if (!isSuccess) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION; pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION;
Log.e(TAG, "enterPip failed,because PIP feature is disabled"); Log.e(TAG, "enterPip failed,because PIP feature is disabled");
} else if(!hasPipPermission()) { } else if (!hasPipPermission()) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION; pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION;
Log.e(TAG, "enterPip failed,because PIP has no permission"); Log.e(TAG, "enterPip failed,because PIP has no permission");
} }
...@@ -153,7 +153,7 @@ public class FTXPIPManager { ...@@ -153,7 +153,7 @@ public class FTXPIPManager {
AppOpsManager appOpsManager = (AppOpsManager) mActivity.getSystemService(Context.APP_OPS_SERVICE); AppOpsManager appOpsManager = (AppOpsManager) mActivity.getSystemService(Context.APP_OPS_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int permissionResult = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, int permissionResult = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE,
android.os.Process.myUid(),mActivity.getPackageName()); android.os.Process.myUid(), mActivity.getPackageName());
return permissionResult == AppOpsManager.MODE_ALLOWED; return permissionResult == AppOpsManager.MODE_ALLOWED;
} else { } else {
return false; return false;
...@@ -184,15 +184,25 @@ public class FTXPIPManager { ...@@ -184,15 +184,25 @@ public class FTXPIPManager {
} }
private void initPipReceiver() { private void initPipReceiver() {
if (!isRegisterReceiver) { try {
IntentFilter pipIntentFilter = new IntentFilter(FTXEvent.ACTION_PIP_PLAY_CONTROL); if (!isRegisterReceiver) {
mActivity.registerReceiver(pipActionReceiver, pipIntentFilter); IntentFilter pipIntentFilter = new IntentFilter(FTXEvent.ACTION_PIP_PLAY_CONTROL);
isRegisterReceiver = true; mActivity.registerReceiver(pipActionReceiver, pipIntentFilter);
isRegisterReceiver = true;
}
} catch (Exception e) {
Log.getStackTraceString(e);
} }
} }
public void releaseReceiver() { public void releaseReceiver() {
mActivity.unregisterReceiver(pipActionReceiver); try {
if (isRegisterReceiver) {
mActivity.unregisterReceiver(pipActionReceiver);
}
} catch (Exception e) {
Log.getStackTraceString(e);
}
} }
/** /**
...@@ -207,7 +217,7 @@ public class FTXPIPManager { ...@@ -207,7 +217,7 @@ public class FTXPIPManager {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
List<RemoteAction> actions = new ArrayList<>(); List<RemoteAction> actions = new ArrayList<>();
// play back // play back
if(params.mIsNeedPlayBack) { if (params.mIsNeedPlayBack) {
Bundle backData = new Bundle(); Bundle backData = new Bundle();
backData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_BACK); backData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_BACK);
backData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId); backData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId);
...@@ -219,7 +229,7 @@ public class FTXPIPManager { ...@@ -219,7 +229,7 @@ public class FTXPIPManager {
} }
// resume or pause // resume or pause
if(params.mIsNeedPlayControl) { if (params.mIsNeedPlayControl) {
Bundle playOrPauseData = new Bundle(); Bundle playOrPauseData = new Bundle();
playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId); playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId);
playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_RESUME_OR_PAUSE); playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_RESUME_OR_PAUSE);
...@@ -233,7 +243,7 @@ public class FTXPIPManager { ...@@ -233,7 +243,7 @@ public class FTXPIPManager {
} }
// forward // forward
if(params.mIsNeedPlayForward) { if (params.mIsNeedPlayForward) {
Bundle forwardData = new Bundle(); Bundle forwardData = new Bundle();
forwardData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_FORWARD); forwardData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_FORWARD);
forwardData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId); forwardData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, params.mCurrentPlayerId);
...@@ -288,18 +298,18 @@ public class FTXPIPManager { ...@@ -288,18 +298,18 @@ public class FTXPIPManager {
String mPlayResumeAssetPath; String mPlayResumeAssetPath;
String mPlayPauseAssetPath; String mPlayPauseAssetPath;
String mPlayForwardAssetPath; String mPlayForwardAssetPath;
int mCurrentPlayerId; int mCurrentPlayerId;
protected PictureInPictureParams.Builder mPipParams; protected PictureInPictureParams.Builder mPipParams;
private boolean mIsNeedPlayBack = true; private boolean mIsNeedPlayBack = true;
private boolean mIsNeedPlayForward = true; private boolean mIsNeedPlayForward = true;
private boolean mIsNeedPlayControl = true; private boolean mIsNeedPlayControl = true;
/** /**
* @param mPlayBackAssetPath 回退按钮图片资源路径,传空则使用系统默认图标 * @param mPlayBackAssetPath 回退按钮图片资源路径,传空则使用系统默认图标
* @param mPlayResumeAssetPath 播放按钮图片资源路径,传空则使用系统默认图标 * @param mPlayResumeAssetPath 播放按钮图片资源路径,传空则使用系统默认图标
* @param mPlayPauseAssetPath 暂停按钮图片资源路径,传空则使用系统默认图标 * @param mPlayPauseAssetPath 暂停按钮图片资源路径,传空则使用系统默认图标
* @param mPlayForwardAssetPath 前进按钮图片资源路径,传空则使用系统默认图标 * @param mPlayForwardAssetPath 前进按钮图片资源路径,传空则使用系统默认图标
* @param mCurrentPlayerId 播放器id * @param mCurrentPlayerId 播放器id
*/ */
public PipParams(String mPlayBackAssetPath, String mPlayResumeAssetPath, String mPlayPauseAssetPath, public PipParams(String mPlayBackAssetPath, String mPlayResumeAssetPath, String mPlayPauseAssetPath,
String mPlayForwardAssetPath, int mCurrentPlayerId) { String mPlayForwardAssetPath, int mCurrentPlayerId) {
......
...@@ -29,7 +29,7 @@ android { ...@@ -29,7 +29,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.super_player_example" applicationId "com.tencent.liteav.demo"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 31 targetSdkVersion 31
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
......
...@@ -558,12 +558,12 @@ class SuperPlayerController { ...@@ -558,12 +558,12 @@ class SuperPlayerController {
void _updatePlayerUIStatus(int status) { void _updatePlayerUIStatus(int status) {
if (_playerUIStatus != status) { if (_playerUIStatus != status) {
_playerUIStatus = status;
if (status == SuperPlayerUIStatus.FULLSCREEN_MODE) { if (status == SuperPlayerUIStatus.FULLSCREEN_MODE) {
_addSimpleEvent(SuperPlayerViewEvent.onStartFullScreenPlay); _addSimpleEvent(SuperPlayerViewEvent.onStartFullScreenPlay);
} else { } else if(_playerUIStatus == SuperPlayerUIStatus.FULLSCREEN_MODE) {
_addSimpleEvent(SuperPlayerViewEvent.onStopFullScreenPlay); _addSimpleEvent(SuperPlayerViewEvent.onStopFullScreenPlay);
} }
_playerUIStatus = status;
} }
} }
...@@ -656,6 +656,7 @@ class SuperPlayerController { ...@@ -656,6 +656,7 @@ class SuperPlayerController {
/// seek 到需要的时间点进行播放 /// seek 到需要的时间点进行播放
Future<void> seek(double progress) async { Future<void> seek(double progress) async {
if (playerType == SuperPlayerType.VOD) { if (playerType == SuperPlayerType.VOD) {
_needToPause = false;
await _vodPlayerController.seek(progress); await _vodPlayerController.seek(progress);
bool isPlaying = await _vodPlayerController.isPlaying(); bool isPlaying = await _vodPlayerController.isPlaying();
// resume when not playing.if isPlaying is null,not resume // resume when not playing.if isPlaying is null,not resume
......
...@@ -84,8 +84,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -84,8 +84,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
} }
}); });
// only register listen once // only register listen once
_pipSubscription = _pipSubscription = SuperPlayerPlugin.instance.onExtraEventBroadcast.listen((event) {
SuperPlayerPlugin.instance.onExtraEventBroadcast.listen((event) {
int eventCode = event["event"]; int eventCode = event["event"];
if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_EXIT) { if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_EXIT) {
// exit floatingMode // exit floatingMode
...@@ -96,9 +95,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -96,9 +95,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
_playController.getCurrentController().pause(); _playController.getCurrentController().pause();
} }
} else if (Platform.isIOS) { } else if (Platform.isIOS) {
_onResume();
EasyLoading.dismiss(); EasyLoading.dismiss();
} }
_isFloatingMode = false; _isFloatingMode = false;
_playController._updatePlayerUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
} else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_REQUEST_START) { } else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_REQUEST_START) {
// EVENT_PIP_MODE_ALREADY_ENTER 的状态变化有滞后性,进入PIP之后才会通知,这里需要监听EVENT_PIP_MODE_REQUEST_START, // EVENT_PIP_MODE_ALREADY_ENTER 的状态变化有滞后性,进入PIP之后才会通知,这里需要监听EVENT_PIP_MODE_REQUEST_START,
// 在即将进入PIP模式下就要开始进行PIP模式的UI准备 // 在即将进入PIP模式下就要开始进行PIP模式的UI准备
...@@ -111,6 +112,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -111,6 +112,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
EasyLoading.showToast(StringResource.OPEN_PIP); EasyLoading.showToast(StringResource.OPEN_PIP);
} }
_isFloatingMode = true; _isFloatingMode = true;
_playController._updatePlayerUIStatus(SuperPlayerUIStatus.PIP_MODE);
} else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_ENTER) { } else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_ENTER) {
if (Platform.isIOS) { if (Platform.isIOS) {
EasyLoading.dismiss(); EasyLoading.dismiss();
...@@ -124,11 +126,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs ...@@ -124,11 +126,11 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
EasyLoading.showToast(StringResource.ERROR_PIP); EasyLoading.showToast(StringResource.ERROR_PIP);
} }
_isFloatingMode = false; _isFloatingMode = false;
_playController._updatePlayerUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
print('$eventCode'); print('$eventCode');
} }
}); });
_volumeSubscription = _volumeSubscription = SuperPlayerPlugin.instance.onEventBroadcast.listen((event) {
SuperPlayerPlugin.instance.onEventBroadcast.listen((event) {
int eventCode = event["event"]; int eventCode = event["event"];
if (_isFloatingMode && _isPlaying) { if (_isFloatingMode && _isPlaying) {
if (eventCode == TXVodPlayEvent.EVENT_AUDIO_FOCUS_PAUSE) { if (eventCode == TXVodPlayEvent.EVENT_AUDIO_FOCUS_PAUSE) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论