Bild im Bild

Mit der Bild-in-Bild-Funktion (PIP) für Android-Handheld-Geräte können Nutzer eine App mit einer laufenden Aktivität in ein kleines Fenster verkleinern. PIP ist besonders nützlich für Video-Apps, da die Wiedergabe von Inhalten fortgesetzt wird, 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 derzeit im Bild-in-Bild-Modus befindet, über (bis zu drei) von der App bereitgestellte Aktionen interagieren.

Für PIP ist eine explizite Aktivierung durch Anwendungen erforderlich, die es unterstützen. Es funktioniert auf Aktivitätsbasis. Eine einzelne Anwendung kann mehrere Aktivitäten haben, von denen sich nur eine im PIP-Modus befindet. Aktivitäten fordern den Bild-in-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 PIP-Modus und benutzerdefinierte Aktionen steuern, mit denen Nutzer mit der Aktivität interagieren können, ohne sie maximieren zu müssen. Im PIP-Modus befindet sich die Aktivität in einem pausierten, aber gerenderten Zustand und erhält keine direkten Touch-Eingaben oder Fensterfokus. Es kann jeweils nur eine Aufgabe im PIP-Modus sein.

Weitere Informationen finden Sie in der Android-Entwickler Dokumentation zu Bild-in-Bild.

Geräteanforderungen

Wenn Sie PIP unterstützen möchten, aktivieren Sie die Systemfunktion PackageManager#FEATURE_PICTURE_IN_PICTURE in /android/frameworks/base/core/java/android/content/pm/PackageManager.java. Geräte, die PIP unterstützen, müssen einen Bildschirm haben, der an der kleinsten Breite größer als 220 dp ist. Ähnlich wie beim Splitscreen-Mehrfenstermodus können mit BiB 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 UI befindet sich im SystemUI Paket.

Änderungen am System sollten sich nicht auf das intrinsische Verhalten auswirken, wie in den Tests der Compatibility Test Suite (CTS) definiert. Die Systemlogik für PIP dreht sich hauptsächlich um die Verwaltung von Aufgaben und Aktivitäten im „angehefteten“ Stack. Hier eine kurze Übersicht über die Klassen:

  • ActivityRecord: verfolgt den Bild-in-Bild-Status jeder Aktivität. Wenn Sie verhindern möchten, dass Nutzer unter bestimmten Umständen in den PIP-Modus wechseln, z. B. vom Sperrbildschirm oder während der VR-Nutzung, fügen Sie Fälle zu checkEnterPictureInPictureState() hinzu.
  • ActivityManagerService: die primäre Schnittstelle von der Aktivität, um den PIP-Modus anzufordern, und die Schnittstelle für Aufrufe von WindowManager und SystemUI, um den PIP-Aktivitätsstatus zu ändern.
  • ActivityStackSupervisor: wird von ActivityManagerService aufgerufen, um Aufgaben in den angehefteten Stack zu verschieben oder daraus zu entfernen, und WindowManager nach Bedarf zu aktualisieren.
  • PinnedStackWindowController: die WindowManager Schnittstelle von ActivityManager.
  • PinnedStackController: meldet Änderungen im System an SystemUI, z. B. IME ein-/ausgeblendet, Seitenverhältnis geändert oder Aktionen geändert.
  • BoundsAnimationController: animiert die PIP Aktivitätsfenster so, 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 PIP-Fensters in der Nähe der Bildschirmränder steuert.

Die Referenz SystemUI bietet eine vollständige Implementierung von PIP, die die Präsentation benutzerdefinierter Aktionen für Nutzer und allgemeine Manipulationen wie Maximieren und Schließen unterstützt. Gerätehersteller können auf diesen Änderungen aufbauen, solange sie das intrinsische Verhalten, wie im CDD definiert, nicht beeinträchtigen. Hier eine kurze Übersicht über die Klassen:

  • PipManager: die SystemUI -Komponente, die mit SystemUI gestartet wird.
  • PipTouchHandler: der Touch-Handler, der die Gesten steuert, mit denen das PIP-Fenster manipuliert wird. Er wird nur verwendet, wenn der Eingabe empfänger für das PIP-Fenster aktiv ist (siehe InputConsumerController). Hier können neue Gesten hinzugefügt werden.
  • PipMotionHelper: eine Hilfsklasse, die die PIP-Position und die zulässige Region auf dem Bildschirm verfolgt. Ruft ActivityManagerService auf, um die Position und Größe des PIP-Fensters zu aktualisieren oder zu animieren.
  • PipMenuActivityController: startet eine Aktivität , die die Aktionen anzeigt, die von der Aktivität bereitgestellt werden, die sich derzeit im PIP-Modus befindet. Diese Aktivität ist eine Aufgaben-Overlay-Aktivität und entfernt den überlagernden Eingabeempfänger, damit sie interaktiv sein kann.
  • PipMenuActivity: die Implementierung für die Menüaktivität.
  • PipMediaController: der Listener, der SystemUI aktualisiert, wenn sich die Mediensitzung so ändert, dass sich dies auf die Standardaktionen im PIP-Fenster 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 PIP-Fenster interagieren, um darauf hinzuweisen, dass es geschlossen werden kann.

Standardplatzierung

Es gibt verschiedene Systemressourcen, die die Standardplatzierung des PIP-Fensters steuern:

  • config_defaultPictureInPictureGravity: die Gravity Ganzzahl, die die Ecke steuert, in der das PIP-Fenster platziert wird, z. B. BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets: die Offsets von den Seiten des Bildschirms, um das PIP-Fenster zu platzieren.
  • config_pictureInPictureDefaultSizePercent und config_pictureInPictureDefaultAspectRatio: Die Kombination aus dem Prozentsatz der Bildschirmbreite und dem Seitenverhältnis steuert die Größe des PIP-Fensters. Die berechnete Standardgröße des PIP-Fensters darf nicht kleiner als @dimen/default_minimal_size_pip_resizable_task sein, wie in CTS und CDD definiert.
  • config_pictureInPictureSnapMode: das Einrastverhalten , wie in PipSnapAlgorithm definiert.

Geräteimplementierungen dürfen die im CDD und CTS definierten minimalen und maximalen Seitenverhältnisse nicht ändern.

Berechtigungen

Mit der paketbezogenen "Anwendungsoperation" (OP_PICTURE_IN_PICTURE) in AppOpsManager (main/core/java/android/app/AppOpsManager.java) können Nutzer PIP auf Anwendungsebene über die Systemeinstellungen steuern. Geräteimplementierungen müssen diese Prüfung berücksichtigen, wenn eine Aktivität den Bild-in-Bild-Modus anfordert.

Test

Führen Sie zum Testen von PIP-Implementierungen alle Tests im Zusammenhang mit Bild-in-Bild aus, die in den CTS-Tests auf Hostseite unter /cts/hostsidetests/services/activitymanager zu finden sind, insbesondere in ActivityManagerPinnedStackTests.java.