La funzionalità Picture in picture (PIP) per i dispositivi mobili Android consente agli utenti di ridimensionare un'app con un'attività in corso in una piccola finestra. Il PIP è particolarmente utile per le app video perché i contenuti continuano a essere riprodotti mentre l'utente è libero di eseguire altre azioni. Gli utenti possono manipolare la posizione di questa finestra tramite SystemUI e interagire con l'applicazione attualmente in modalità Picture in picture con un massimo di tre azioni fornite dall'app.
La modalità PIP richiede l'attivazione esplicita da parte delle applicazioni che la supportano e funziona in base all'attività. Una singola applicazione può avere più attività, ma solo una
di queste è in modalità PIP. Le attività richiedono di attivare la modalità Picture in picture chiamando
enterPictureInPictureMode()
e ricevono i callback delle attività sotto forma di
onPictureInPictureModeChanged()
.
Il metodo setPictureInPictureParams()
consente alle attività di controllare le proporzioni in modalità PIP e le azioni personalizzate, che consentono agli utenti di interagire con l'attività senza doverla espandere. In PIP, l'attività è in uno stato di pausa,
ma di rendering, e non riceve direttamente input tattili o la messa a fuoco della finestra.
È possibile visualizzare una sola attività in PIP alla volta.
Per ulteriori informazioni, consulta la documentazione Picture in Picture>di Android Developers.
Requisiti del dispositivo
Per supportare la modalità PIP, attiva la funzionalità di sistema
PackageManager#FEATURE_PICTURE_IN_PICTURE
in
/android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
I dispositivi che supportano la modalità PIP devono avere uno schermo più grande di 220 dp nella sua
larghezza più piccola. Simile al multi-window con schermo diviso, la modalità PIP consente di eseguire più attività sullo schermo contemporaneamente. Pertanto, i dispositivi devono avere
CPU e RAM sufficienti per supportare questo caso d'uso.
Implementazione
La maggior parte della gestione del ciclo di vita dell'attività viene eseguita nel sistema tra
ActivityManager
e WindowManager
.
L'implementazione dell'interfaccia utente di riferimento si trova nel pacchetto SystemUI
.
Le modifiche al sistema non devono influire sul suo comportamento intrinseco come definito dai test della suite di test di compatibilità (CTS). La logica di sistema per PIP ruota principalmente attorno alla gestione di attività all'interno dello stack "bloccato". Ecco una rapida panoramica del corso:
ActivityRecord
: tiene traccia dello stato picture in picture di ogni attività. Per impedire agli utenti di attivare la modalità PIP in determinate circostanze, ad esempio dalla schermata di blocco o durante la VR, aggiungi casi acheckEnterPictureInPictureState()
.ActivityManagerService
: l'interfaccia principale dall'attività per richiedere l'inserimento della modalità PIP e l'interfaccia per le chiamate daWindowManager
eSystemUI
per modificare lo stato dell'attività PIP.ActivityStackSupervisor
: chiamato daActivityManagerService
per spostare le attività all'interno o all'esterno dello stack bloccato, aggiornandoWindowManager
in base alle necessità.PinnedStackWindowController
: l'interfacciaWindowManager
a partire daActivityManager
.PinnedStackController
: segnala le modifiche apportate al sistema aSystemUI
, ad esempio la visualizzazione/occultamento dell'IME, la modifica delle proporzioni o delle azioni.BoundsAnimationController
: anima le finestre di attività PIP in modo da non attivare una modifica della configurazione durante il ridimensionamento.PipSnapAlgorithm
: una classe condivisa utilizzata sia nel sistema che in SystemUI che controlla il comportamento di snapping della finestra PIP vicino ai bordi dello schermo.
Il riferimento SystemUI
fornisce un'implementazione completa di PIP che supporta la presentazione di azioni personalizzate
agli utenti e la manipolazione generale, come l'espansione e la chiusura.
I produttori di dispositivi possono basarsi su queste modifiche, a condizione che non influiscano
sui comportamenti intrinseci definiti dal CDD. Ecco una rapida panoramica
della classe:
PipManager
: il componenteSystemUI
avviato conSystemUI
.PipTouchHandler
: il gestore touch, che controlla i gesti che manipolano la PIP. Viene utilizzato solo mentre il consumatore di input per la PIP è attivo (vediInputConsumerController
). Qui è possibile aggiungere nuove gesture.PipMotionHelper
: una classe di utilità che monitora la posizione PIP e la regione consentita sullo schermo. ChiamaActivityManagerService
per aggiornare o animare la posizione e le dimensioni della PIP.PipMenuActivityController
: avvia un'attività che mostra le azioni fornite dall'attività attualmente in PIP. Questa attività è un'attività di overlay delle attività e rimuove il consumatore di input sovrapposto per consentirne l'interazione.PipMenuActivity
:l'implementazione per l'attività di menu.PipMediaController
: il listener che aggiornaSystemUI
quando la sessione multimediale cambia in modo da influire sulle azioni predefinite nella modalità PIP.PipNotificationController
: il controller che garantisce che una notifica sia attiva mentre un utente utilizza la funzionalità PIP.PipDismissViewController
: la sovrapposizione mostrata agli utenti quando iniziano a interagire con la modalità PIP per indicare che può essere chiusa.
Posizionamento predefinito
Esistono varie risorse di sistema che controllano il posizionamento predefinito della PIP:
config_defaultPictureInPictureGravity
: l'intero gravità, che controlla l'angolo in cui posizionare la PIP, ad esempioBOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
: gli offset dai lati dello schermo per posizionare la PIP.config_pictureInPictureDefaultSizePercent
econfig_pictureInPictureDefaultAspectRatio
: la combinazione di percentuale della larghezza dello schermo e proporzioni controlla le dimensioni della PIP. La dimensione PIP predefinita calcolata non deve essere inferiore a@dimen/default_minimal_size_pip_resizable_task
, come definito da CTS e CDD.config_pictureInPictureSnapMode
: il comportamento di snapping definito inPipSnapAlgorithm
.
Le implementazioni dei dispositivi non devono modificare le proporzioni minime e massime definite in CDD e CTS.
Autorizzazioni
L'"operazione dell'applicazione" per pacchetto
(OP_PICTURE_IN_PICTURE
) in AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) consente
agli utenti di controllare la modalità PIP a livello di applicazione tramite le impostazioni di sistema.
Le implementazioni del dispositivo devono rispettare questo controllo quando un'attività richiede di
entrare in modalità Picture in picture.
Test
Per testare le implementazioni PIP, esegui tutti i test correlati al picture in picture che si trovano nei test CTS lato host in /cts/hostsidetests/services/activitymanager
, in particolare in ActivityManagerPinnedStackTests.java
.