Android 8.0 (livello API 26) consente alle attività di avviare in modalità picture-in-picture (PIP). PIP è un tipo speciale di modalità multi-finestra utilizzato principalmente per il video playback.It consente all’utente di guardare un video in una piccola finestra appuntata in un angolo dello schermo mentre naviga tra le app o naviga i contenuti nella schermata principale.
PIP sfrutta le API multi-finestra disponibili in Android 7.0 per fornire la finestra di sovrapposizione video bloccata. Per aggiungere PIP alla tua app, devi registrare le tue attività che supportano PIP, passare la tua attività alla modalità PIP come necessario e assicurarsi che gli elementi dell’interfaccia utente siano nascosti e che la riproduzione video continui quando l’attività è in modalità PIP.
La finestra PIP appare nel livello più alto dello schermo, in un angolo scelto dal sistema. Puoi trascinare la finestra PIP in un’altra posizione., Quando si tocca la finestra vengono visualizzati due controlli speciali: un interruttore a schermo intero (al centro della finestra) e un pulsante di chiusura (una “X” in alto a destraangolo).
La tua app controlla quando l’attività corrente entra in modalità PIP. Ecco alcuni esempi:
- Un’attività può entrare in modalità PIP quando l’utente tocca home o recentsbutton per scegliere un’altra app. (Questo è il modo in cui Google Maps continua a visualizzare le direzioni mentre l’userruns un’altra attività allo stesso tempo.)
- La tua app può spostare un video in modalità PIP quando l’utente naviga indietro dal video per sfogliare altri contenuti.,
- La tua app può passare un video in modalità PIP mentre un utente guarda la fine di un episodio di contenuti. La schermata principale visualizza promozionale o riepilogoinformazioni sul prossimo episodio della serie.
- La tua app può fornire agli utenti un modo per accodare contenuti aggiuntivi mentre guardano un video. Il video continua a essere riprodotto in modalità PIP mentre la schermata principale visualizza un’attività di selezione del contenuto.
Dichiarare picture-in-picture supporto
Per impostazione predefinita, il sistema non supporta automaticamente PIP per le applicazioni.,Se vuoi supportare PIP nella tua app, registra la tua videoattività nel manifest impostando android:supportsPictureInPicture
sutrue
. Inoltre, specifica che l’attività gestisce le modifiche alla configurazione del layout in modo che activitydoesn’t si riavvii quando si verificano modifiche al layout durante le transizioni in modalità PIP.
Passare l’attività a picture-in-picture
Per entrare in modalità picture-in-picture, un’attività deve chiamareenterPictureInPictureMode()
., Ad esempio, il followingcode passa un’attività in modalità PIP quando l’utente fa clic su un pulsante dedicato nell’interfaccia utente dell’app:
Potresti voler includere la logica che commuta un’attività in modalità PIP invece di entrare in thebackground. Ad esempio, Google Maps passa alla modalità PIP se l’utente preme home o recentsbutton mentre l’app sta navigando., È possibile rilevare questo caso sovrascrivendoonUserLeaveHint()
:
Gestione dell’interfaccia utente durante picture-in-picture
Quando l’attività entra o esce dalla modalità picture-in-picture, il sistema chiamaActivity.onPictureInPictureModeChanged()
oFragment.onPictureInPictureModeChanged()
.
È necessario sovrascrivere questi callback per ridisegnare gli elementi dell’interfaccia utente dell’attività. Tieni presente che inPIP mode la tua attività è mostrata in una piccola finestra. Gli utenti non possono interagire con gli elementi dell’interfaccia utente quando la modalità inPIP e i dettagli di piccoli elementi dell’interfaccia utente possono essere difficili da vedere. Le attività di riproduzione video con un’interfaccia utente minima offrono la migliore esperienza utente., L’attività dovrebbe mostrare solo playbackcontrols video. Rimuovi altri elementi dell’interfaccia utente prima che la tua attività entri in PIP e ripristinali quando youractivity diventa di nuovo a schermo intero:
Aggiunta di controlli
La finestra PIP può visualizzare i controlli quando l’utente apre il menu della finestra (toccando la finestra su un dispositivo mobile o selezionando il menu dal telecomando del televisore.)
Se un’app ha una sessione activemedia, appariranno i controlli play, pause, next e previous.,
Puoi anche specificare esplicitamente le azioni personalizzate costruendoPictureInPictureParams
con PictureInPictureParams.Builder.setActions()
prima di entrare in modalità PIP, e passare i parametri quando entri in modalità PIP usandoenterPictureInPictureMode(android.app.PictureInPictureParams)
osetPictureInPictureParams(android.app.PictureInPictureParams)
.Fai attenzione. Se si tenta di aggiungere più digetMaxNumPictureInPictureActions()
si otterrà solo il numero massimo.
Continuare il videoplayback mentre in picture-in-picture
Quando l’attività passa a PIP, il sistema posiziona l’attività nello stato di sospensione e chiama il metodoonPause()
dell’attività., La riproduzione video non deve essere messa in pausa e dovrebbe continuarepagando se l’attività è in pausa mentre è in modalità PIP.
In Android 7.0 e versioni successive, dovresti mettere in pausa e riprendere la riproduzione video quando il sistema chiama onStop()
della tua attività eonStart()
. In questo modo, puoi evitare di dover verificare se la tua app è in modalità PIP inonPause()
e esplicitamente continuare la riproduzione.,
Se si dispone di mettere in pausa la riproduzione in un onPause()
attuazione, di controllo per la modalità PIP chiamando isInPictureInPictureMode()
e gestire la riproduzione in modo appropriato, per esempio:
Quando la tua attività switch di modalità PIP torna alla modalità a schermo intero, thesystem riprende l’attività e chiama ilonResume()
metodo.
Utilizzando una singola attività di riproduzione per foto in immagine
Nella tua app, un utente potrebbe selezionare un nuovo video durante la ricerca di contenuti nella schermata principale, mentre un’attività di riproduzione video è in modalità PIP., Riproduci il nuovo video nell’attività di riproduzione esistente in modalità a schermo intero, invece di lanciare una nuova attività che potrebbe confondere l’utente.
Per garantire una singola attività viene utilizzato per la riproduzione di video richieste andswitched o in modalità PIP, come necessario, impostare le attività diandroid:launchMode
singleTask
in un manifesto:
<activity android:name="VideoActivity" ... android:supportsPictureInPicture="true" android:launchMode="singleTask" ...
Nella vostra attività, eseguire l’override di onNewIntent()
e gestire il nuovo video, l’arresto di tutti i esistenti videoplayback, se necessario.
Best practice
Il PIP potrebbe essere disabilitato su dispositivi con RAM bassa., Prima che la tua app usi PIP, controlla che sia disponibile chiamando hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
.
PIP è destinato ad attività che riproducono video a schermo intero. Quando si passa alla tua attività in modalità PIP, evitare di mostrare qualsiasi cosa tranne il contenuto video.Tieni traccia quando la tua attività entra in modalità PIP e nascondi gli elementi dell’interfaccia utente, come descritto nella gestione dell’interfaccia utente durante picture-in-picture.
Poiché la finestra PIP è mostrata come una finestra mobile nell’angolo dello schermo, dovresti evitare di mostrare informazioni critiche nella schermata principale in qualsiasi area che può essere oscurata dalla finestra PIP.,
Quando un’attività è in modalità PIP, per impostazione predefinita non ottiene il focus di input. Per ricevere gli eventi di input in modalità PIP, utilizzare MediaSession.setCallback()
. Per ulteriori informazioni sull’utilizzo disetCallback()
seeDisplayinga Ora giocare a carte.
Quando l’app è in modalità PIP, la riproduzione video nella finestra PIP può causare interferenze audio con un’altra app, ad esempio un’app per lettore musicale o un’app per ricerca vocale. Per evitare ciò,richiedere la messa a fuoco audio quando si inizia a riprodurre il video e gestire le notifiche di modifica della messa a fuoco audio, come descritto in Gestione AudioFocus., Se si riceve una notifica di perdita di messa a fuoco audio in modalità PIP, mettere in pausa o interrompere la riproduzione video.
Quando la tua app sta per entrare in PIP, nota che solo l’attività principale entrerà Picture-in-Picture. In alcune situazioni, ad esempio su dispositivi multi-finestra, è possibile che l’attività sottostante venga ora mostrata e diventi nuovamente visibile accanto all’attività PIP. Dovresti gestire questo caso di conseguenza, inclusa l’attività sottostante ottenendo un onResume()
o un onPause()
callback. È anche possibile che l’utente possa interagire con l’attività., Ad esempio, se è visualizzata un’attività dell’elenco video e l’attività di riproduzione video in modalità PIP, l’utente potrebbe selezionare un nuovo video dall’elenco e l’attività PIP dovrebbe aggiornarsi di conseguenza.
Codice di esempio aggiuntivo
Per scaricare un’app di esempio scritta in Android, seePicture-in-Picture Sample.To scarica un’app di esempio scritta in Kotlin, Vedeandroid PictureInPicture Sample (Kotlin).