From 464f008023ab2996c1632e95b0ddeff54fc4ac32 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sat, 18 Oct 2025 11:27:56 +0800 Subject: [PATCH] fix #1615 Signed-off-by: bggRGjQaUbCoE --- .../com/example/piliplus/MainActivity.kt | 9 +++++++++ lib/pages/video/view.dart | 13 ++++++++++++- lib/plugin/pl_player/controller.dart | 19 ++++++++++++------- lib/utils/page_utils.dart | 19 ++++++++++--------- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt index 3713d151..2c339f2a 100644 --- a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt @@ -1,5 +1,6 @@ package com.example.piliplus +import android.app.PictureInPictureParams import android.app.SearchManager import android.content.ComponentName import android.content.Intent @@ -102,6 +103,14 @@ class MainActivity : AudioServiceActivity() { } catch (_: Throwable) {} result.success(false) } + "setPipAutoEnterEnabled" -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val params = PictureInPictureParams.Builder() + .setAutoEnterEnabled(call.argument("autoEnable") ?: false) + .build() + setPictureInPictureParams(params) + } + } else -> result.notImplemented() } } diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index e1e2b133..c08c19ba 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -199,9 +199,9 @@ class _VideoDetailPageVState extends State // 播放器状态监听 Future playerListener(PlayerStatus status) async { + bool isPlaying = status == PlayerStatus.playing; try { if (videoDetailController.scrollCtr.hasClients) { - bool isPlaying = status == PlayerStatus.playing; if (isPlaying) { if (!videoDetailController.isExpanding && videoDetailController.scrollCtr.offset != 0 && @@ -275,6 +275,17 @@ class _VideoDetailPageVState extends State } } } + if (Platform.isAndroid && + plPlayerController!.autoPiP && + await Utils.sdkInt >= 12) { + if (isPlaying) { + plPlayerController!.enterPip(isAuto: true); + } else { + Utils.channel.invokeMethod('setPipAutoEnterEnabled', { + 'autoEnable': false, + }); + } + } } // 继续播放或重新播放 diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 91857a78..11286bb2 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -309,10 +309,11 @@ class PlPlayerController { } } - void enterPip() { + void enterPip({bool isAuto = false}) { if (videoController != null) { final state = videoController!.player.state; PageUtils.enterPip( + isAuto: isAuto, width: state.width ?? width, height: state.height ?? height, ); @@ -556,12 +557,16 @@ class PlPlayerController { } if (Platform.isAndroid && autoPiP) { - Utils.channel.setMethodCallHandler((call) async { - if (call.method == 'onUserLeaveHint') { - if (playerStatus.status.value == PlayerStatus.playing && - Get.currentRoute.startsWith('/video')) { - enterPip(); - } + Utils.sdkInt.then((sdkInt) { + if (sdkInt < 12) { + Utils.channel.setMethodCallHandler((call) async { + if (call.method == 'onUserLeaveHint') { + if (playerStatus.playing && + Get.currentRoute.startsWith('/video')) { + enterPip(); + } + } + }); } }); } diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index be8abe1b..0da89479 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -350,20 +350,21 @@ abstract class PageUtils { ); } - static void enterPip({int? width, int? height}) { + static void enterPip({int? width, int? height, bool isAuto = false}) { if (width != null && height != null) { Rational aspectRatio = Rational(width, height); + aspectRatio = aspectRatio.fitsInAndroidRequirements + ? aspectRatio + : height > width + ? const Rational.vertical() + : const Rational.landscape(); Floating().enable( - EnableManual( - aspectRatio: aspectRatio.fitsInAndroidRequirements - ? aspectRatio - : height > width - ? const Rational.vertical() - : const Rational.landscape(), - ), + isAuto + ? AutoEnable(aspectRatio: aspectRatio) + : EnableManual(aspectRatio: aspectRatio), ); } else { - Floating().enable(const EnableManual()); + Floating().enable(isAuto ? const AutoEnable() : const EnableManual()); } }