W tagu aktywności pliku AndroidManifest.xml:
- Dodaj element
supportsPictureInPicturei ustaw go natrue, aby zadeklarować, że w aplikacji będziesz używać trybu Picture-in-Picture. Dodaj zmienną
configChangesi ustaw ją naorientation|screenLayout|screenSize|smallestScreenSize, aby określić, że Twoja aktywność obsługuje zmiany konfiguracji układu. Dzięki temu aktywność nie będzie się uruchamiać ponownie, gdy nastąpi zmiana układu podczas przełączania się między trybami.<activity android:name=".SnippetsActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize" android:theme="@style/Theme.Snippets">
W kodzie usługi Compose wykonaj te czynności:
- Dodaj to rozszerzenie w witrynie
Context. W tym przewodniku wielokrotnie będziesz używać tego rozszerzenia, aby uzyskać dostęp do aktywności.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 przypadku aplikacji, które nie obsługują Androida 12
Aby dodać PiP na urządzeniach z Androidem w wersji 12 lub starszej, użyj addOnUserLeaveHintProvider. Aby dodać PiP w przypadku wersji Androida 12 lub starszych:
- Dodaj bramkę wersji, aby ten kod był dostępny tylko w wersjach od O do R.
- Użyj
DisposableEffectz kluczemContext. - W elemencie
DisposableEffectokreśl zachowanie, które ma być wykonywane, gdy elementonUserLeaveHintProviderzostanie wywołany za pomocą funkcji lambda. W funkcji lambda wywołaj funkcjęenterPictureInPictureMode()w obiekciefindActivity()i przekaż parametrPictureInPictureParams.Builder().build(). - Dodaj
addOnUserLeaveHintListenerza pomocąfindActivity()i przekaż wyrażenie lambda. - W funkcji
onDisposedodaj funkcjęremoveOnUserLeaveHintListenerza pomocą funkcjifindActivity()i przekaż ją do funkcji 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 PiP w aplikacji Leave na Androidzie 12 i nowszych
W Androidzie 12 i nowszych PictureInPictureParams.Builder jest dodawane za pomocą modyfikatora przekazywanego do odtwarzacza wideo aplikacji.
- Utwórz
modifieri na nim wywołaj funkcjęonGloballyPositioned. współrzędnych układu, które będą używane w dalszym kroku. - Utwórz zmienną dla
PictureInPictureParams.Builder(). - Dodaj instrukcję
if, aby sprawdzić, czy pakiet SDK ma wersję S lub nowszą. Jeśli tak, dodajsetAutoEnterEnableddo kreatora i ustaw je natrue, aby włączyć tryb PiP po przesunięciu palcem. Dzięki temu animacja będzie płynniejsza niż w przypadku korzystania zenterPictureInPictureMode. - Aby zadzwonić do
setPictureInPictureParams(), użyj aplikacjifindActivity(). Zadzwoń pod numerbuild()nabuilderi przekaż informacje.
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 PiP
Aby ustawić format obrazu okna PiP, możesz wybrać określony format obrazu lub użyć szerokości i wysokości rozmiaru filmu w odtwarzaczu. Jeśli używasz odtwarzacza media3, przed ustawieniem formatu obrazu sprawdź, czy odtwarzacz nie jest pusty i czy rozmiar filmu nie jest równy [VideoSize.UNKNOWN][6].
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 odtwarzacza niestandardowego, ustaw jego proporcje wysokości i szerokości za pomocą składni właściwej dla tego odtwarzacza. Pamiętaj, że jeśli podczas inicjowania odtwarzacz zmieni rozmiar i wyjdzie poza dopuszczalne granice formatu obrazu, aplikacja ulegnie awarii. Może być konieczne dodanie kontroli, gdy można obliczyć współczynnik proporcji, podobnie jak w przypadku odtwarzacza media3.