Die Funktion „Bild im Bild“

Mit der Bild-in-Bild-Funktion (PIP) für Android-Handgeräte können Benutzer die Größe einer App während einer laufenden Aktivität in einem kleinen Fenster ändern. PIP ist besonders nützlich für Video-Apps, da Inhalte weiterhin abgespielt werden, während der Benutzer andere Aktionen ausführen kann. Benutzer können die Position dieses Fensters über die SystemUI manipulieren und mit der aktuell im Bild-in-Bild angezeigten Anwendung mit (bis zu drei) von der App bereitgestellten Aktionen interagieren.

PIP erfordert eine explizite Zustimmung von Anwendungen, die es unterstützen, und funktioniert auf Aktivitätsbasis. (Eine einzelne Anwendung kann mehrere Aktivitäten haben, von denen sich nur eine in PIP befindet.) Aktivitäten fordern die Eingabe von Bild-in-Bild durch den Aufruf von enterPictureInPictureMode() an und erhalten Aktivitätsrückrufe in Form von onPictureInPictureModeChanged() .

Mit der setPictureInPictureParams() Methode können Aktivitäten ihr Seitenverhältnis im PIP steuern und benutzerdefinierte Aktionen ausführen, die es Benutzern ermöglichen, mit der Aktivität zu interagieren, ohne sie erweitern zu müssen. In PIP befindet sich die Aktivität in einem angehaltenen, aber gerenderten Zustand und erhält keine direkte Berührungseingabe oder einen Fensterfokus. Es kann sich jeweils nur eine einzelne Aufgabe im PIP befinden.

Weitere Informationen finden Sie in der Android Developer Picture-in-Picture- Dokumentation.

Geräteanforderungen

Um PIP zu unterstützen, 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 bei kleinster Breite größer als 220 dp ist. Ähnlich wie bei Split-Screen-Multi-Window ermöglicht PIP die gleichzeitige Ausführung mehrerer Aktivitäten auf dem Bildschirm. Daher sollten Geräte über ausreichend CPU und RAM verfügen, um diesen Anwendungsfall zu unterstützen.

Implementierung

Der Großteil der Aktivitätslebenszyklusverwaltung erfolgt im System zwischen ActivityManager und WindowManager . Die Referenz-UI-Implementierung befindet sich im SystemUI Paket.

Änderungen am System sollten sich nicht auf sein intrinsisches Verhalten gemäß den Tests der Compatibility Test Suite (CTS) auswirken. Die Systemlogik für PIP dreht sich hauptsächlich um die Verwaltung von Aufgaben und Aktivitäten innerhalb des „angehefteten“ Stapels. Hier ist eine kurze Klassenübersicht:

  • ActivityRecord : Verfolgt den Bild-in-Bild-Status jeder Aktivität. Um zu verhindern, dass Benutzer PIP unter bestimmten Umständen eingeben, z. B. über den Sperrbildschirm oder während der VR, fügen Sie Fälle zu checkEnterPictureInPictureState() hinzu.
  • ActivityManagerService : die primäre Schnittstelle der Aktivität zum Anfordern der Eingabe von PIP und die Schnittstelle für Aufrufe von WindowManager und SystemUI zum Ändern des PIP-Aktivitätsstatus.
  • ActivityStackSupervisor : Wird vom ActivityManagerService aufgerufen, um Aufgaben in den oder aus dem angehefteten Stapel zu verschieben und den WindowManager nach Bedarf zu aktualisieren.
  • PinnedStackWindowController : die WindowManager Schnittstelle von ActivityManager .
  • PinnedStackController : Meldet Änderungen im System an SystemUI , z. B. angezeigter/ausgeblendeter IME, geändertes Seitenverhältnis oder geänderte Aktionen.
  • BoundsAnimationController : Animiert die PIP-Aktivitätsfenster auf eine Weise, die beim Ändern der Größe keine Konfigurationsänderung auslöst.
  • PipSnapAlgorithm : eine gemeinsam genutzte Klasse, die sowohl im System als auch in SystemUI verwendet wird und das Fangverhalten 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 Benutzer und allgemeine Manipulationen wie Erweiterung und Entlassung unterstützt. Gerätehersteller können auf diesen Änderungen aufbauen, solange sie das in der CDD definierte intrinsische Verhalten nicht beeinträchtigen. Hier ist eine kurze Klassenübersicht:

  • PipManager : die SystemUI Komponente, die mit SystemUI gestartet wird.
  • PipTouchHandler : der Touch-Handler, der die Gesten steuert, die das PIP manipulieren. Dies wird nur verwendet, während der Eingabekonsument für das PIP aktiv ist (siehe InputConsumerController ). Hier können neue 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 : startet eine Aktivität, die die Aktionen anzeigt, die von der aktuell in PIP befindlichen Aktivität bereitgestellt werden. Diese Aktivität ist eine Task-Overlay-Aktivität und entfernt den überlagernden Eingabekonsumenten, um eine interaktive Aktivität zu ermöglichen.
  • PipMenuActivity : die Implementierung für die Menüaktivität.
  • PipMediaController : Der Listener, der SystemUI aktualisiert, wenn sich die Mediensitzung auf eine Weise ändert, die sich auf die Standardaktionen auf dem PIP auswirken könnte.
  • PipNotificationController : Der Controller, der sicherstellt, dass eine Benachrichtigung aktiv ist, während ein Benutzer die PIP-Funktion verwendet.
  • PipDismissViewController : Das Overlay, das Benutzern angezeigt wird, wenn sie mit dem PIP interagieren, um anzuzeigen, dass es verworfen werden kann.

Standardplatzierung

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

  • config_defaultPictureInPictureGravity : die Ganzzahl der Schwerkraft , die die Ecke zum Platzieren des PIP steuert, z. B. BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : die Versätze von den Seiten des Bildschirms, um das PIP zu platzieren.
  • config_pictureInPictureDefaultSizePercent und config_pictureInPictureDefaultAspectRatio : Die Kombination aus Prozentsatz der Bildschirmbreite und dem Seitenverhältnis steuert die Größe des PIP. Die berechnete Standard-PIP-Größe sollte nicht kleiner sein als @dimen/default_minimal_size_pip_resizable_task , wie von CTS und CDD definiert.
  • config_pictureInPictureSnapMode : das Fangverhalten, wie in PipSnapAlgorithm definiert.

Geräteimplementierungen sollten die minimalen und maximalen Seitenverhältnisse, die im CDD und CTS definiert sind, nicht ändern.

Berechtigungen

Der paketweise „Anwendungsvorgang“ ( OP_PICTURE_IN_PICTURE ) in AppOpsManager ( main/core/java/android/app/AppOpsManager.java ) ermöglicht Benutzern die Steuerung von PIP auf anwendungsspezifischer Ebene über die Systemeinstellungen. Geräteimplementierungen müssen diese Prüfung berücksichtigen, wenn eine Aktivität den Wechsel in den Bild-in-Bild-Modus anfordert.

Testen

Um PIP-Implementierungen zu testen, führen Sie alle Bild-in-Bild-bezogenen Tests aus, die in den hostseitigen CTS-Tests unter /cts/hostsidetests/services/activitymanager zu finden sind, insbesondere in ActivityManagerPinnedStackTests.java .