Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-10-18 11:27:56 +08:00
parent 52498b3e34
commit 464f008023
4 changed files with 43 additions and 17 deletions

View File

@@ -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<Boolean>("autoEnable") ?: false)
.build()
setPictureInPictureParams(params)
}
}
else -> result.notImplemented()
}
}

View File

@@ -199,9 +199,9 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
// 播放器状态监听
Future<void> 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<VideoDetailPageV>
}
}
}
if (Platform.isAndroid &&
plPlayerController!.autoPiP &&
await Utils.sdkInt >= 12) {
if (isPlaying) {
plPlayerController!.enterPip(isAuto: true);
} else {
Utils.channel.invokeMethod('setPipAutoEnterEnabled', {
'autoEnable': false,
});
}
}
}
// 继续播放或重新播放

View File

@@ -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();
}
}
});
}
});
}

View File

@@ -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());
}
}