W tagu aktywności w pliku AndroidManifest.xml wykonaj te czynności:
- Dodaj
supportsPictureInPicturei ustaw wartośćtrue, aby zadeklarować, że będziesz używać w aplikacji trybu obraz w obrazie. - Dodaj
configChangesi ustaw wartośćorientation|screenLayout|screenSize|smallestScreenSize, aby określić, że aktywność obsługuje zmiany konfiguracji układu. Dzięki temu aktywność nie zostanie ponownie uruchomiona, gdy podczas przejścia do trybu PIP nastąpią zmiany układu.
<activity
android:name=".SnippetsActivity"
android:exported="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
android:theme="@style/Theme.Snippets">
W kodzie Compose wykonaj te czynności:
- Dodaj to rozszerzenie w witrynie
Context. Aby uzyskać dostęp do aktywności, będziesz wielokrotnie korzystać z tego rozszerzenia.internal fun Context.findActivity(): ComponentActivity { var context = this while (context is ContextWrapper) { if (context is ComponentActivity) return context context = context.baseContext } throw IllegalStateException("Picture in picture should be called in the context of an Activity") }
Dodawanie PiP w aplikacji do obsługi wniosków o urlop w przypadku wersji Androida starszych niż 12
Aby dodać obraz w obrazie na urządzeniu z Androidem starszym niż 12, użyj addOnUserLeaveHintProvider. Aby dodać tryb obrazu w obrazie w wersjach Androida starszych niż 12:
- Dodaj bramę wersji, aby ten kod był dostępny tylko w wersjach od O do R.
- Użyj
DisposableEffectz kluczemContext. - Wewnątrz
DisposableEffectzdefiniuj działanie, które ma być wykonywane po uruchomieniuonUserLeaveHintProvider, za pomocą funkcji lambda. W funkcji lambda wywołajenterPictureInPictureMode()nafindActivity()i przekażPictureInPictureParams.Builder().build(). - Dodaj
addOnUserLeaveHintListenerza pomocąfindActivity()i przekaż lambdę. - W
onDisposedodajremoveOnUserLeaveHintListenerza pomocąfindActivity()i przekaż wyrażenie lambda.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) { val context = LocalContext.current DisposableEffect(context) { val onUserLeaveBehavior = Runnable { context.findActivity() .enterPictureInPictureMode(PictureInPictureParams.Builder().build()) } context.findActivity().addOnUserLeaveHintListener( onUserLeaveBehavior ) onDispose { context.findActivity().removeOnUserLeaveHintListener( onUserLeaveBehavior ) } } } else { Log.i("PiP info", "API does not support PiP") }
Dodawanie trybu obrazu w obrazie w aplikacji urlopowej na urządzeniach z Androidem w wersji 12 lub nowszej
W przypadku Androida 12 i nowszych wersji parametr PictureInPictureParams.Builder jest dodawany za pomocą modyfikatora przekazywanego do odtwarzacza wideo aplikacji.
- Utwórz
modifieri zadzwoń na numeronGloballyPositioned. Współrzędne układu zostaną użyte w późniejszym kroku. - Utwórz zmienną dla
PictureInPictureParams.Builder(). - Dodaj instrukcję
if, aby sprawdzić, czy pakiet SDK ma wersję S lub nowszą. Jeśli tak, dodaj do narzędzia do tworzenia parametrsetAutoEnterEnabledi ustaw go natrue, aby po przesunięciu palcem włączyć tryb obrazu w obrazie. Zapewnia to płynniejszą animację niż przechodzenie przezenterPictureInPictureMode. - Użyj numeru
findActivity(), aby zadzwonić na numersetPictureInPictureParams(). Zadzwoń pod numerbuild()nabuilderi przekaż go.
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(true) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
Użyj setAspectRatio, aby ustawić proporcje okna obrazu w obrazie.
Aby ustawić format obrazu okna PiP, możesz wybrać konkretny format lub użyć szerokości i wysokości odtwarzanego filmu. Jeśli używasz odtwarzacza media3, przed ustawieniem współczynnika proporcji sprawdź, czy odtwarzacz nie ma wartości null i czy rozmiar filmu w odtwarzaczu nie jest równy VideoSize.UNKNOWN.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode && player != null && player.videoSize != VideoSize.UNKNOWN) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) builder.setAspectRatio( Rational(player.videoSize.width, player.videoSize.height) ) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
Jeśli używasz niestandardowego odtwarzacza, ustaw współczynnik proporcji wysokości i szerokości odtwarzacza za pomocą składni właściwej dla Twojego odtwarzacza. Pamiętaj, że jeśli odtwarzacz zmieni rozmiar podczas inicjowania i wyjdzie poza prawidłowe granice współczynnika proporcji, aplikacja ulegnie awarii. Może być konieczne dodanie kontroli dotyczących tego, kiedy można obliczyć współczynnik proporcji, podobnie jak w przypadku odtwarzacza Media3.