我有两个活动A和B,一个活动有视频列表。单击视频后,它会转到B(播放器)活动来播放视频。
面临的问题
A(视频列表)--> B(玩家活动)
当我单击后退按钮B活动进入 PIP 模式。现在A在 PIP 模式(视频播放)下可见且B活动。我再次单击后退按钮,它关闭了A活动,但B仍处于 PIP 模式。现在B活动将 PIP 模式保留为完全活动。
现在再次单击后退按钮,我想将A显示为 PIP 模式的后退堆栈B活动。但是B活动进入 PIP 模式,但返回屏幕作为主屏幕。
当我在 B 活动中单击主页按钮时, B活动进入 PIP 模式。PIP 中的B活动现在可以访问主屏幕。现在单击PIP模式屏幕以完全活动。
现在再次单击后退按钮,我想将A显示为 PIP 模式的后退堆栈B活动。但是B活动进入 PIP 模式,但返回屏幕作为主屏幕。
显现
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".PlayerActivity"
android:allowTaskReparenting="true"
android:autoRemoveFromRecents="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|layoutDirection"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:screenOrientation="sensor"
android:supportsPictureInPicture="true" />
画中画代码
private void pictureInPictureMode() {
if (supportsPiPMode() && getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
Rational aspectRatio = new Rational(playerView.getWidth(), playerView.getHeight());
pictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build();
if (canEnterPiPMode()) enterPictureInPictureMode(pictureInPictureParamsBuilder.build());
}
}
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
inPIP = isInPictureInPictureMode;
if (isInPictureInPictureMode) {
landscapeViews();
bottomAdv.setVisibility(View.GONE);
} else {
portraitViews();
}
}
@Override
protected void onUserLeaveHint() {
pictureInPictureMode();
}
private boolean canEnterPiPMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
return (AppOpsManager.MODE_ALLOWED == appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, Process.myUid(), getPackageName()));
}
return false;
}
public boolean supportsPiPMode() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
在B活动中,每当单击后退按钮时,都需要将 A活动作为返回堆栈B到 PIP 模式。指导我解决这个问题。