Bild im Bild

Mit der Bild-im-Bild-Funktion (PiB) für Android-Handheld-Geräte können Nutzer die Größe einer App mit einer laufenden Aktivität in einem kleinen Fenster anpassen. BiB ist besonders für Video-Apps nützlich, da die 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 bis zu drei von der App bereitgestellten Aktionen mit der Anwendung interagieren, die sich derzeit im Bild-im-Bild-Modus befindet.

Für PIP ist eine explizite Aktivierung in den entsprechenden Apps erforderlich. Die Funktion funktioniert pro Aktivität. Eine einzelne Anwendung kann mehrere Aktivitäten haben, von denen nur eine im PIP-Modus ist. Aktivitäten fordern durch Aufrufen von enterPictureInPictureMode() den Bild-im-Bild-Modus an und erhalten Aktivitäts-Callbacks in Form von onPictureInPictureModeChanged().

Mit der setPictureInPictureParams()-Methode können Aktivitäten das Seitenverhältnis in der Bild-im-Bild-Ansicht und bei benutzerdefinierten Aktionen steuern. So können Nutzer mit der Aktivität interagieren, ohne sie maximieren zu müssen. Im PIP-Modus befindet sich die Aktivität im pausierten, aber gerenderten Zustand und empfängt keine direkte Touch-Eingabe oder Fensterfokus. Es kann immer nur eine Aufgabe im PIP-Modus angezeigt werden.

Weitere Informationen finden Sie in der Dokumentation zu Picture-in-Picture für Android-Entwickler.

Geräteanforderungen

Wenn du PIP nutzen möchtest, aktiviere 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 ein Display haben, dessen kleinste Breite größer als 220 dp ist. Ähnlich wie beim Splitscreen-Multifenster können mit PIP mehrere Aktivitäten gleichzeitig auf dem Bildschirm ausgeführt werden. Daher sollten die Geräte eine ausreichende CPU und einen ausreichenden RAM haben, um diesen Anwendungsfall zu unterstützen.

Implementierung

Die meisten Aktivitäten werden zwischen ActivityManager und WindowManager im System verwaltet. Die Referenz-UI-Implementierung befindet sich im Paket SystemUI.

Änderungen am System dürfen sich nicht auf das inhärente Verhalten auswirken, wie es in den CTS-Tests (Compatibility Test Suite) definiert ist. Die Systemlogik für PIP dreht sich hauptsächlich um die Verwaltung von Aufgaben und Aktivitäten im angepinnten Stapel. Hier eine kurze Übersicht über die Kurse:

  • ActivityRecord:Hier wird der Bild-im-Bild-Status jeder Aktivität erfasst. Wenn Sie verhindern möchten, dass Nutzer unter bestimmten Umständen in den PIP-Modus wechseln, z. B. vom Sperrbildschirm aus oder während der Nutzung von VR, fügen Sie checkEnterPictureInPictureState() Fälle hinzu.
  • ActivityManagerService:Die primäre Schnittstelle, über die die Aktivität den Eintritt in den PIP anfordert, und die Schnittstelle für Aufrufe von WindowManager und SystemUI, um den Status der PIP-Aktivität zu ändern.
  • ActivityStackSupervisor:Wird vom ActivityManagerService aufgerufen, um Aufgaben in den angepinnten Stapel zu verschieben oder daraus zu entfernen und die WindowManager bei Bedarf zu aktualisieren.
  • PinnedStackWindowController:die WindowManager-Oberfläche von ActivityManager.
  • PinnedStackController:Meldet Änderungen am System an SystemUI, z. B. ob die IME angezeigt oder ausgeblendet wird, das Seitenverhältnis geändert wurde oder Aktionen geändert wurden.
  • BoundsAnimationController:Die PIP-Aktivitätsfenster werden so animiert, dass beim Ändern der Größe keine Konfigurationsänderung ausgelöst wird.
  • PipSnapAlgorithm:Eine freigegebene Klasse, die sowohl im System als auch in der SystemUI verwendet wird und das Anpinnen des PIP-Fensters an den Rändern des Displays steuert.

Die Referenz SystemUI bietet eine vollständige Implementierung von PIP, die die Präsentation benutzerdefinierter Aktionen und allgemeine Manipulationen wie Maximieren und Minimieren unterstützt. Gerätehersteller können auf diesen Änderungen aufbauen, solange sie sich nicht auf das inhärente Verhalten auswirken, wie es in der Gerätebeschreibung definiert ist. Hier ist eine kurze Übersicht über die Kurse:

  • PipManager:Die SystemUI-Komponente, die mit SystemUI gestartet wird.
  • PipTouchHandler:Der Touch-Handler, der die Touch-Gesten steuert, mit denen das PIP bedient wird. Dieser Bereich wird nur verwendet, wenn der Eingabeempfänger für das PIP aktiv ist (siehe InputConsumerController). Hier können neue Touch-Gesten hinzugefügt werden.
  • PipMotionHelper:Eine praktische Klasse, die die PIP-Position und den zulässigen Bereich auf dem Bildschirm verfolgt. Ruft ActivityManagerService auf, um die Position und Größe des PIP zu aktualisieren oder zu animieren.
  • PipMenuActivityController:Damit wird eine Aktivität gestartet, in der die Aktionen angezeigt werden, die von der Aktivität im PIP angeboten werden. Diese Aktivität ist eine Aktivität mit Aufgaben-Overlay. Der überlagernde Eingabeempfänger wird entfernt, damit die Aktivität interaktiv ist.
  • PipMenuActivity:Implementierung der Menüaktivität.
  • PipMediaController:Der Listener, der SystemUI aktualisiert, wenn sich die Mediensitzung so ändert, dass sich das auf die Standardaktionen für das PIP 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 interagieren, um anzuzeigen, dass es geschlossen werden kann.

Standard-Placement

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

  • config_defaultPictureInPictureGravity:Die Ganzzahl gravity, die die Ecke für das Platzieren des PIP steuert, z. B. BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets:die Abstände von den Seiten des Bildschirms, um das PIP zu platzieren.
  • config_pictureInPictureDefaultSizePercent und config_pictureInPictureDefaultAspectRatio:Die Größe des PIP wird durch die Kombination aus dem Prozentsatz der Bildschirmbreite und dem Seitenverhältnis bestimmt. Die berechnete Standard-PIP-Größe darf gemäß CTS und CDD nicht kleiner als @dimen/default_minimal_size_pip_resizable_task sein.
  • config_pictureInPictureSnapMode:das Anpassen an Objekte, wie in PipSnapAlgorithm definiert.

Geräteimplementierungen dürfen die in der CDD und CTS definierten Mindest- und Höchstseitenverhältnisse nicht ändern.

Berechtigungen

Mit der paketspezifischen „Anwendungsfunktion“ (OP_PICTURE_IN_PICTURE) in AppOpsManager (main/core/java/android/app/AppOpsManager.java) können Nutzer PIP über die Systemeinstellungen auf Anwendungsebene steuern. Bei Geräteimplementierungen muss diese Prüfung durchgeführt werden, wenn eine Aktivität den Modus „Bild-im-Bild“ anfordert.

Testen

Führen Sie zum Testen von PIP-Implementierungen alle PIP-bezogenen Tests aus, die sich in den hostseitigen CTS-Tests unter /cts/hostsidetests/services/activitymanager befinden, insbesondere in ActivityManagerPinnedStackTests.java.