提交 1d584a00 authored 作者: kongdywang's avatar kongdywang

fix android 12 pip restore problem

上级 3ad3539b
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
android:resizeableActivity="true" android:resizeableActivity="true"
android:launchMode="singleTask" android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="stateHidden" android:windowSoftInputMode="stateHidden"
tools:ignore="UnusedAttribute" > tools:ignore="UnusedAttribute" >
<intent-filter> <intent-filter>
...@@ -23,6 +22,8 @@ ...@@ -23,6 +22,8 @@
<action android:name="com.tencent.flutter.updatePip"/> <action android:name="com.tencent.flutter.updatePip"/>
</intent-filter> </intent-filter>
</activity> </activity>
<service android:name="com.tencent.vod.flutter.ui.Android12BridgeService"/>
</application> </application>
</manifest> </manifest>
\ No newline at end of file
...@@ -43,7 +43,6 @@ import java.util.Map; ...@@ -43,7 +43,6 @@ import java.util.Map;
public class FTXPIPManager { public class FTXPIPManager {
private static final String TAG = "FTXPIPManager"; private static final String TAG = "FTXPIPManager";
private static final int REQUEST_PIP_CODE = 1;
private boolean misInit = false; private boolean misInit = false;
private final Map<Integer, PipCallback> pipCallbacks = new HashMap<>(); private final Map<Integer, PipCallback> pipCallbacks = new HashMap<>();
...@@ -142,7 +141,7 @@ public class FTXPIPManager { ...@@ -142,7 +141,7 @@ public class FTXPIPManager {
intent.setAction(FTXEvent.PIP_ACTION_START); intent.setAction(FTXEvent.PIP_ACTION_START);
intent.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params); intent.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.putExtra(FTXEvent.EXTRA_NAME_VIDEO, videoModel); intent.putExtra(FTXEvent.EXTRA_NAME_VIDEO, videoModel);
mActivityBinding.getActivity().startActivityForResult(intent, REQUEST_PIP_CODE); mActivityBinding.getActivity().startActivity(intent);
mIsInPipMode = true; mIsInPipMode = true;
} }
return pipResult; return pipResult;
...@@ -380,7 +379,7 @@ public class FTXPIPManager { ...@@ -380,7 +379,7 @@ public class FTXPIPManager {
actions.add(nextAction); actions.add(nextAction);
} }
PictureInPictureParams.Builder mPipParams = new Builder(); Builder mPipParams = new Builder();
mPipParams.setActions(actions); mPipParams.setActions(actions);
return mPipParams.build(); return mPipParams.build();
} }
......
...@@ -15,17 +15,10 @@ import android.util.SparseArray; ...@@ -15,17 +15,10 @@ import android.util.SparseArray;
import android.view.OrientationEventListener; import android.view.OrientationEventListener;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.tencent.rtmp.TXLiveBase; import com.tencent.rtmp.TXLiveBase;
import com.tencent.rtmp.TXPlayerGlobalSetting; import com.tencent.rtmp.TXPlayerGlobalSetting;
import com.tencent.vod.flutter.ui.Android12BridgeService;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
...@@ -34,6 +27,10 @@ import io.flutter.plugin.common.MethodCall; ...@@ -34,6 +27,10 @@ import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.MethodChannel.Result;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/** /**
* SuperPlayerPlugin * SuperPlayerPlugin
...@@ -286,6 +283,9 @@ public class SuperPlayerPlugin implements FlutterPlugin, MethodCallHandler, Acti ...@@ -286,6 +283,9 @@ public class SuperPlayerPlugin implements FlutterPlugin, MethodCallHandler, Acti
if (null != mTxPipManager) { if (null != mTxPipManager) {
mTxPipManager.releaseActivityListener(); mTxPipManager.releaseActivityListener();
} }
// 关闭用于解决Android12部分版本上画中画点击还原失灵的问题
Intent serviceIntent = new Intent(mActivityPluginBinding.getActivity(), Android12BridgeService.class);
mActivityPluginBinding.getActivity().stopService(serviceIntent);
unregisterReceiver(); unregisterReceiver();
} }
......
package com.tencent.vod.flutter.ui;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import androidx.annotation.Nullable;
/**
* 为了解决多次打开画中画的时候,启动画中画被认为是后台启动,导致无法启动的问题。
* 该问题出现于android 12版本上,目前只在MIUI的android 12版本上发现该问题。
*/
public class Android12BridgeService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Android12BridgeServiceBinder();
}
class Android12BridgeServiceBinder extends Binder {
public Android12BridgeService getService() {
return Android12BridgeService.this;
}
}
}
...@@ -5,14 +5,17 @@ package com.tencent.vod.flutter.ui; ...@@ -5,14 +5,17 @@ package com.tencent.vod.flutter.ui;
import android.app.PictureInPictureParams; import android.app.PictureInPictureParams;
import android.app.PictureInPictureUiState; import android.app.PictureInPictureUiState;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.os.Build.VERSION; import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES; import android.os.Build.VERSION_CODES;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.Surface; import android.view.Surface;
...@@ -30,13 +33,13 @@ import com.tencent.rtmp.TXPlayInfoParams; ...@@ -30,13 +33,13 @@ import com.tencent.rtmp.TXPlayInfoParams;
import com.tencent.rtmp.TXVodPlayer; import com.tencent.rtmp.TXVodPlayer;
import com.tencent.vod.flutter.FTXEvent; import com.tencent.vod.flutter.FTXEvent;
import com.tencent.vod.flutter.FTXPIPManager.PipParams; import com.tencent.vod.flutter.FTXPIPManager.PipParams;
import com.tencent.vod.flutter.R;
import com.tencent.vod.flutter.model.PipResult; import com.tencent.vod.flutter.model.PipResult;
import com.tencent.vod.flutter.model.VideoModel; import com.tencent.vod.flutter.model.VideoModel;
import com.tencent.vod.flutter.R;
import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.android.FlutterActivity;
public class FlutterPipImplActivity extends FlutterActivity implements Callback, ITXVodPlayListener, public class FlutterPipImplActivity extends FlutterActivity implements Callback, ITXVodPlayListener,
ITXLivePlayListener { ITXLivePlayListener, ServiceConnection {
private static final String TAG = "FlutterPipImplActivity"; private static final String TAG = "FlutterPipImplActivity";
...@@ -114,6 +117,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -114,6 +117,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
mVideoSurface.getHolder().addCallback(this); mVideoSurface.getHolder().addCallback(this);
setVodPlayerListener(); setVodPlayerListener();
setLivePlayerListener(); setLivePlayerListener();
bindAndroid12BugServiceIfNeed();
} }
private void setVodPlayerListener() { private void setVodPlayerListener() {
...@@ -228,8 +232,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -228,8 +232,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
} }
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;
sendPipBroadCast(codeEvent, data); sendPipBroadCast(codeEvent, data);
overridePendingTransition(0, 0); exitPip(codeEvent == FTXEvent.EVENT_PIP_MODE_ALREADY_EXIT);
finish();
} }
@Override @Override
...@@ -244,7 +247,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -244,7 +247,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
if (TextUtils.equals(action, FTXEvent.PIP_ACTION_START)) { if (TextUtils.equals(action, FTXEvent.PIP_ACTION_START)) {
startPipVideoFromIntent(intent); startPipVideoFromIntent(intent);
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) { } else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) {
exitPip(); exitPip(false);
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) { } else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) {
PipParams pipParams = intent.getParcelableExtra(FTXEvent.EXTRA_NAME_PARAMS); PipParams pipParams = intent.getParcelableExtra(FTXEvent.EXTRA_NAME_PARAMS);
updatePip(pipParams); updatePip(pipParams);
...@@ -263,8 +266,32 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -263,8 +266,32 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
} }
} }
private void exitPip() { /**
finish(); * 关闭画中画,使用finish当前界面的方式,关闭画中画
*
* @param closeImmediately 立刻关闭,不执行延迟,在android 12以上,如果画中画处于非当前app界面下,立刻关闭可能会造成无法返回app问题
*/
private void exitPip(boolean closeImmediately) {
if (!isFinishing() && !isDestroyed()) {
// 由于android 12 的前台服务启动限制,导致画中画返回后,过早关闭activity界面的话,无法正常拉起app。所以这里增加延时处理
if (Build.VERSION.SDK_INT >= VERSION_CODES.S && !closeImmediately) {
mVodPlayer.stopPlay(true);
mLivePlayer.stopPlay(true);
mVideoSurface.setVisibility(View.GONE);
mVideoProgress.setVisibility(View.GONE);
mVideoProgress.postDelayed(new Runnable() {
@Override
public void run() {
overridePendingTransition(0, 0);
finish();
}
}, 400);
} else {
overridePendingTransition(0, 0);
finish();
}
}
} }
private void startPipVideoFromIntent(Intent intent) { private void startPipVideoFromIntent(Intent intent) {
...@@ -337,9 +364,21 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -337,9 +364,21 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
@Override @Override
protected void onDestroy() { protected void onDestroy() {
unRegisterPipBroadcast(); unRegisterPipBroadcast();
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
unbindService(this);
}
super.onDestroy(); super.onDestroy();
} }
private void bindAndroid12BugServiceIfNeed() {
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
Intent serviceIntent = new Intent(this, Android12BridgeService.class);
startService(serviceIntent);
bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
}
}
private void attachSurface(Surface surface) { private void attachSurface(Surface surface) {
if (null != mVideoModel) { if (null != mVideoModel) {
if (mVideoModel.getPlayerType() == FTXEvent.PLAYER_VOD) { if (mVideoModel.getPlayerType() == FTXEvent.PLAYER_VOD) {
...@@ -455,4 +494,13 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback, ...@@ -455,4 +494,13 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
@Override @Override
public void onNetStatus(Bundle bundle) { public void onNetStatus(Bundle bundle) {
} }
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- 取消界面转场动画使用--> <!-- 取消界面转场动画使用-->
<style name="Theme" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"> <style name="Theme" parent="android:Theme.Translucent.NoTitleBar.Fullscreen">
<item name="android:windowAnimationStyle">@style/Animation</item> <item name="android:windowAnimationStyle">@style/Animation</item>
<item name="android:background">@android:color/transparent</item> <item name="android:background">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item> <item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowActivityTransitions" tools:targetApi="lollipop">false</item>
<item name="android:windowEnterTransition" tools:targetApi="lollipop">@null</item>
<item name="android:windowExitTransition" tools:targetApi="lollipop">@null</item>
</style> </style>
<style name="Animation"> <style name="Animation">
<item name="android:activityOpenEnterAnimation">@null</item> <item name="android:activityOpenEnterAnimation">@null</item>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论