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

fix android 12 pip restore problem

上级 3ad3539b
......@@ -14,7 +14,6 @@
android:resizeableActivity="true"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="stateHidden"
tools:ignore="UnusedAttribute" >
<intent-filter>
......@@ -23,6 +22,8 @@
<action android:name="com.tencent.flutter.updatePip"/>
</intent-filter>
</activity>
<service android:name="com.tencent.vod.flutter.ui.Android12BridgeService"/>
</application>
</manifest>
\ No newline at end of file
......@@ -43,7 +43,6 @@ import java.util.Map;
public class FTXPIPManager {
private static final String TAG = "FTXPIPManager";
private static final int REQUEST_PIP_CODE = 1;
private boolean misInit = false;
private final Map<Integer, PipCallback> pipCallbacks = new HashMap<>();
......@@ -142,7 +141,7 @@ public class FTXPIPManager {
intent.setAction(FTXEvent.PIP_ACTION_START);
intent.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.putExtra(FTXEvent.EXTRA_NAME_VIDEO, videoModel);
mActivityBinding.getActivity().startActivityForResult(intent, REQUEST_PIP_CODE);
mActivityBinding.getActivity().startActivity(intent);
mIsInPipMode = true;
}
return pipResult;
......@@ -380,7 +379,7 @@ public class FTXPIPManager {
actions.add(nextAction);
}
PictureInPictureParams.Builder mPipParams = new Builder();
Builder mPipParams = new Builder();
mPipParams.setActions(actions);
return mPipParams.build();
}
......
......@@ -15,17 +15,10 @@ import android.util.SparseArray;
import android.view.OrientationEventListener;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import com.tencent.rtmp.TXLiveBase;
import com.tencent.rtmp.TXPlayerGlobalSetting;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.tencent.vod.flutter.ui.Android12BridgeService;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
......@@ -34,6 +27,10 @@ import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* SuperPlayerPlugin
......@@ -286,6 +283,9 @@ public class SuperPlayerPlugin implements FlutterPlugin, MethodCallHandler, Acti
if (null != mTxPipManager) {
mTxPipManager.releaseActivityListener();
}
// 关闭用于解决Android12部分版本上画中画点击还原失灵的问题
Intent serviceIntent = new Intent(mActivityPluginBinding.getActivity(), Android12BridgeService.class);
mActivityPluginBinding.getActivity().stopService(serviceIntent);
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;
import android.app.PictureInPictureParams;
import android.app.PictureInPictureUiState;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.Surface;
......@@ -30,13 +33,13 @@ import com.tencent.rtmp.TXPlayInfoParams;
import com.tencent.rtmp.TXVodPlayer;
import com.tencent.vod.flutter.FTXEvent;
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.VideoModel;
import com.tencent.vod.flutter.R;
import io.flutter.embedding.android.FlutterActivity;
public class FlutterPipImplActivity extends FlutterActivity implements Callback, ITXVodPlayListener,
ITXLivePlayListener {
ITXLivePlayListener, ServiceConnection {
private static final String TAG = "FlutterPipImplActivity";
......@@ -114,6 +117,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
mVideoSurface.getHolder().addCallback(this);
setVodPlayerListener();
setLivePlayerListener();
bindAndroid12BugServiceIfNeed();
}
private void setVodPlayerListener() {
......@@ -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;
sendPipBroadCast(codeEvent, data);
overridePendingTransition(0, 0);
finish();
exitPip(codeEvent == FTXEvent.EVENT_PIP_MODE_ALREADY_EXIT);
}
@Override
......@@ -244,7 +247,7 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
if (TextUtils.equals(action, FTXEvent.PIP_ACTION_START)) {
startPipVideoFromIntent(intent);
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) {
exitPip();
exitPip(false);
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) {
PipParams pipParams = intent.getParcelableExtra(FTXEvent.EXTRA_NAME_PARAMS);
updatePip(pipParams);
......@@ -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) {
......@@ -337,9 +364,21 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
@Override
protected void onDestroy() {
unRegisterPipBroadcast();
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
unbindService(this);
}
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) {
if (null != mVideoModel) {
if (mVideoModel.getPlayerType() == FTXEvent.PLAYER_VOD) {
......@@ -455,4 +494,13 @@ public class FlutterPipImplActivity extends FlutterActivity implements Callback,
@Override
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"?>
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- 取消界面转场动画使用-->
<style name="Theme" parent="android:Theme.Translucent.NoTitleBar.Fullscreen">
<item name="android:windowAnimationStyle">@style/Animation</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</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 name="Animation">
<item name="android:activityOpenEnterAnimation">@null</item>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论