Mit der Bild-im-Bild-Funktion (BiB) für Android-Handheld-Geräte können Nutzer die Größe einer App mit einer laufenden Aktivität in ein kleines Fenster ändern. BiB ist besonders nützlich für Video-Apps, da Inhalte weiter abgespielt werden, während der Nutzer andere Aktionen ausführen kann. Nutzer können die Position dieses Fensters über die SystemUI ändern und mit der Anwendung, die sich gerade im Bild-im-Bild-Modus befindet, über bis zu drei von der App bereitgestellte Aktionen interagieren.
Für die Bild-im-Bild-Funktion ist eine explizite Aktivierung durch Apps erforderlich, die sie unterstützen. Sie funktioniert auf Aktivitätsbasis. Eine einzelne Anwendung kann mehrere Aktivitäten haben, von denen sich nur eine im BiB-Modus befindet. Aktivitäten fordern den Bild-im-Bild-Modus an, indem sie enterPictureInPictureMode()
aufrufen, und erhalten Aktivitäts-Callbacks in Form von onPictureInPictureModeChanged()
.
Mit der Methode setPictureInPictureParams()
können Aktivitäten ihr Seitenverhältnis im BiB-Modus und benutzerdefinierte Aktionen steuern. So können Nutzer mit der Aktivität interagieren, ohne sie maximieren zu müssen. Im BiB-Modus ist die Aktivität pausiert, wird aber gerendert. Sie empfängt keine direkten Touch-Eingaben oder den Fensterfokus.
Es kann immer nur eine Aufgabe im PIP-Modus angezeigt werden.
Weitere Informationen finden Sie in der Dokumentation für Android-Entwickler zum Thema „Bild-im-Bild“.
Geräteanforderungen
Wenn du die Bild-im-Bild-Funktion unterstützen möchtest, aktiviere das System-Feature PackageManager#FEATURE_PICTURE_IN_PICTURE
in /android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
Geräte, die den Bild-im-Bild-Modus unterstützen, müssen einen Bildschirm mit einer Mindestbreite von 220 dp haben. Ähnlich wie beim Splitscreen-Multifenster können mit PIP mehrere Aktivitäten gleichzeitig auf dem Bildschirm ausgeführt werden. Daher sollten Geräte über genügend CPU und RAM verfügen, um diesen Anwendungsfall zu unterstützen.
Implementierung
Der Großteil der Verwaltung des Aktivitätslebenszyklus erfolgt im System zwischen ActivityManager
und WindowManager
.
Die Referenzimplementierung der Benutzeroberfläche befindet sich im Paket SystemUI
.
Änderungen am System dürfen sich nicht auf das intrinsische Verhalten auswirken, das durch die Compatibility Test Suite (CTS)-Tests definiert ist. Die Systemlogik für den Bild-im-Bild-Modus dreht sich hauptsächlich um die Verwaltung von Aufgaben und Aktivitäten im „angepinnten“ Stapel. Hier ist ein kurzer Überblick über die Klassen:
ActivityRecord
:Erfasst den Bild-im-Bild-Status jeder Aktivität. Wenn Sie verhindern möchten, dass Nutzer unter bestimmten Umständen in den BiB-Modus wechseln, z. B. über den Sperrbildschirm oder während der VR-Nutzung, fügen SiecheckEnterPictureInPictureState()
Fälle hinzu.ActivityManagerService
:Die primäre Schnittstelle der Aktivität, über die der PIP-Modus angefordert wird, und die Schnittstelle für Aufrufe vonWindowManager
undSystemUI
zum Ändern des Status der PIP-Aktivität.ActivityStackSupervisor
:Wird vonActivityManagerService
aufgerufen, um Aufgaben in den angepinnten Stapel zu verschieben oder daraus zu entfernen. Dabei wirdWindowManager
nach Bedarf aktualisiert.PinnedStackWindowController
:DieWindowManager
-Schnittstelle vonActivityManager
.PinnedStackController
:Meldet Änderungen im System anSystemUI
, z. B. das Einblenden/Ausblenden der IME, Änderungen des Seitenverhältnisses oder Änderungen von Aktionen.BoundsAnimationController
:Die PIP-Aktivitätsfenster werden so animiert, dass beim Ändern der Größe keine Konfigurationsänderung ausgelöst wird.PipSnapAlgorithm
:Eine gemeinsame Klasse, die sowohl im System als auch in der SystemUI verwendet wird und das Einrastverhalten des BiB-Fensters in der Nähe der Bildschirmränder steuert.
Die Referenz SystemUI
bietet eine vollständige Implementierung von PIP, die die Darstellung benutzerdefinierter Aktionen für Nutzer und die allgemeine Bearbeitung wie das Maximieren und Schließen unterstützt.
Gerätehersteller können diese Änderungen nutzen, solange sie die im CDD definierten intrinsischen Verhaltensweisen nicht beeinträchtigen. Hier ist eine kurze Übersicht über die Klassen:
PipManager
:dieSystemUI
-Komponente, die mitSystemUI
gestartet wird.PipTouchHandler
:Der Touch-Handler, der die Gesten steuert, mit denen das BiB-Fenster manipuliert wird. Dies wird nur verwendet, wenn der Eingabe-Consumer für das BiB aktiv ist (sieheInputConsumerController
). Hier können neue Gesten hinzugefügt werden.PipMotionHelper
:Eine Hilfsklasse, die die PIP-Position und den zulässigen Bereich auf dem Bildschirm verfolgt. RufeActivityManagerService
auf, um die Position und Größe des BiB zu aktualisieren oder zu animieren.PipMenuActivityController
:Startet eine Aktivität, in der die Aktionen angezeigt werden, die von der Aktivität bereitgestellt werden, die sich derzeit im PIP-Modus befindet. Diese Aktivität ist eine Task-Overlay-Aktivität und entfernt den überlagernden Eingabe-Consumer, damit sie interaktiv sein kann.PipMenuActivity
:Die Implementierung für die Menüaktivität.PipMediaController
:Der Listener, derSystemUI
aktualisiert, wenn sich die Mediensitzung so ändert, dass sich dies auf die Standardaktionen im BiB auswirken könnte.PipNotificationController
:Der Controller, der dafür sorgt, dass eine Benachrichtigung aktiv ist, während ein Nutzer die PIP-Funktion verwendet.PipDismissViewController
:Das Overlay, das Nutzern angezeigt wird, wenn sie mit dem BiB interagieren, um darauf hinzuweisen, dass es geschlossen werden kann.
Standard-Placement
Es gibt verschiedene Systemressourcen, die die Standardpositionierung des BiB steuern:
config_defaultPictureInPictureGravity
:Die Ganzzahl für die Schwerkraft, die die Ecke steuert, in der das BiB platziert wird, z. B.BOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
:Die Offsets von den Bildschirmrändern, an denen das BiB platziert werden soll.config_pictureInPictureDefaultSizePercent
undconfig_pictureInPictureDefaultAspectRatio
:Die Größe des Bild-im-Bild-Fensters wird durch die Kombination aus dem Prozentsatz der Bildschirmbreite und dem Seitenverhältnis bestimmt. Die berechnete Standard-PIP-Größe darf nicht kleiner als@dimen/default_minimal_size_pip_resizable_task
sein, wie in den CTS und dem CDD definiert.config_pictureInPictureSnapMode
:Das Einrastverhalten, wie inPipSnapAlgorithm
definiert.
Bei Geräteimplementierungen dürfen die im CDD und CTS definierten Mindest- und Höchstseitenverhältnisse nicht geändert werden.
Berechtigungen
Mit der paketbezogenen „Anwendungsbedienung“ (OP_PICTURE_IN_PICTURE
) in AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) können Nutzer die Bild-im-Bild-Funktion auf Anwendungsebene über die Systemeinstellungen steuern.
Geräteimplementierungen müssen diese Prüfung berücksichtigen, wenn eine Aktivität den Bild-im-Bild-Modus aufruft.
Testen
Um PIP-Implementierungen zu testen, führen Sie alle PIP-bezogenen Tests aus, die in den hostseitigen CTS-Tests unter /cts/hostsidetests/services/activitymanager
zu finden sind, insbesondere in ActivityManagerPinnedStackTests.java
.