La seguente procedura consente di convertire l'app mittente Android da Cast SDK v2 a CAF Sender, che si basa sul singleton CastContext.
L'SDK Cast CAF Sender utilizza CastContext per gestire GoogleAPIClient per tuo conto. CastContext gestisce per te cicli di vita, errori e callback, il che semplifica notevolmente lo sviluppo di un'app Cast.
Introduzione
- Il mittente CAF è ancora distribuito come parte di Google Play Services tramite Android SDK Manager
- Sono stati aggiunti nuovi pacchetti che si assumono la responsabilità di rispettare
l'elenco di controllo per la progettazione di Google Cast (
com.google.android.gms.cast.framework.*
) - CAF Sender fornisce widget conformi ai requisiti dell'esperienza utente di Cast; la versione 2 non fornisce componenti dell'interfaccia utente e richiede l'implementazione di questi widget.
- Non è più necessario utilizzare GoogleApiClient per utilizzare l'API Cast.
- Il sottotitolaggio codificato in CAF Sender è simile alla versione 2.
Dipendenze
V2 e CAF hanno le stesse dipendenze nelle librerie di supporto e in Google Play Services (9.2.0 o versioni successive) descritte nella Guida alle funzionalità della libreria di supporto.
La versione minima dell'SDK Android supportata da CAF è 9 (Gingerbread).
Inizializzazione
In CAF, è richiesto un passaggio di inizializzazione esplicito per il framework Cast. Questa operazione
prevede l'inizializzazione del singleton di CastContext
, utilizzando un
OptionsProvider
appropriato per specificare l'ID applicazione Web receiver ed eventuali altre opzioni globali.
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}
Dichiara OptionsProvider
nel tag "application" del file AndroidManifest.xml
dell'app:
<application>
...
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>
Inizializza lentamente CastContext
nel metodo onCreate
di ogni attività:
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
Questi passaggi non erano necessari nella versione 2.
Rilevamento dispositivi
In CAF, il processo di rilevamento viene avviato e arrestato automaticamente dal framework quando l'app appare in primo piano e passa rispettivamente in background. MediaRouteSelector
e MediaRouter.Callback
non devono essere
utilizzati.
Pulsante Trasmetti e finestra di dialogo Trasmetti
Come nella versione 2, questi componenti sono forniti dalla libreria di supporto di MediaRouter.
Il pulsante Trasmetti è ancora implementato da
MediaRouteButton
e può essere aggiunto alle tue attività (utilizzando
ActionBar
o un
Toolbar
),
come voce di menu nel menu.
<item
android:id="@+id/media_route_menu_item"
android:title="@string/media_route_menu_title"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>
Sostituisci il metodo onCreateOptionMenu()
di ogni attività utilizzando
CastButtonFactory
per collegare MediaRouteButton
al framework di trasmissione:
private MenuItem mediaRouteMenuItem;
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mediaRouteMenuItem =
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
Quando qualcuno tocca il pulsante, viene visualizzata automaticamente la finestra di dialogo Trasmetti.
Controllo del dispositivo
In CAF, il controllo dei dispositivi è gestito in gran parte dal framework. L'applicazione
del mittente non deve gestire (e non deve provare a gestirla) la connessione al
dispositivo e l'avvio dell'applicazione Web Ricevitore utilizzando
GoogleApiClient
. L'interazione tra mittente e destinatario web è ora rappresentata
come "sessione". La classe SessionManager
gestisce il ciclo di vita della sessione e avvia e interrompe automaticamente le sessioni in risposta ai gesti dell'utente: una sessione viene avviata quando l'utente seleziona un dispositivo di trasmissione nella finestra di dialogo Trasmetti e termina quando l'utente tocca il pulsante "Interrompi trasmissione" nella finestra di dialogo Trasmetti o quando termina l'app del mittente. L'applicazione
del mittente può ricevere notifiche per gli eventi del ciclo di vita delle sessioni registrando una
SessionManagerListener
con SessionManager
. I callback SessionManagerListener
definiscono
i metodi di callback per tutti gli eventi del ciclo di vita delle sessioni.
La classe CastSession
rappresenta una sessione con un dispositivo di trasmissione. Il corso offre metodi per
controllare il volume del dispositivo e gli stati di disattivazione dell'audio, che in precedenza nella versione 2
erano disponibili con i metodi su Cast.CastApi
.
Nella versione 2, i callback di Cast.Listener
fornivano notifiche relative ai cambiamenti di stato del dispositivo, inclusi volume, stato di disattivazione dell'audio, stato di standby e così via.
Nel CAF, le notifiche relative ai cambiamenti di stato del volume/audio vengono comunque inviate tramite metodi di callback in Cast.Listener
; questi listener sono registrati in CastSession
.
Tutte le rimanenti notifiche sullo stato del dispositivo vengono inviate tramite callback di CastStateListener
; questi listener sono registrati con CastSession
. Assicurati
di annullare comunque la registrazione dei listener quando i frammenti, le attività o le app associati passano
in background.
Logica di riconnessione
Come nella versione 2, il CAF tenta di ristabilire le connessioni di rete perse a causa della perdita temporanea del segnale Wi-Fi o di altri errori di rete. Questa operazione viene ora eseguita a livello di sessione. Una sessione può entrare in stato "Sospesa" quando viene persa la connessione, per poi tornare allo stato "Connessa" quando la connettività viene ripristinata. Nell'ambito di questa procedura, il framework si occupa di riconnettere all'applicazione Web receiver e di ricollegare tutti i canali di trasmissione.
Inoltre, CAF aggiunge anche la ripresa automatica delle sessioni, che è abilitata per impostazione predefinita e può essere disattivata tramite CastOptions
.
Se l'applicazione del mittente viene inviata in background o viene terminata (per via di un passaggio o a causa di un arresto anomalo) mentre è in corso una sessione di trasmissione, il framework tenterà di riprendere la sessione quando l'applicazione del mittente torna in primo piano o verrà riavviata; questa operazione viene gestita automaticamente da SessionManager
, che emetterà i callback appropriati su tutte le istanze SessionManagerListener
registrate.
Registrazione a canali personalizzati
Nella versione 2, i canali personalizzati (implementati mediante Cast.MessageReceivedCallback
) sono registrati presso la Cast.CastApi
. In CAF, i canali personalizzati vengono invece registrati con
l'istanza CastSession
. La registrazione può essere effettuata utilizzando il metodo di callback di SessionManagerListener.onSessionStarted
. Per le applicazioni multimediali, non è più necessario registrare esplicitamente il canale di controllo multimediale tramite Cast.CastApi.setMessageReceivedCallbacks
; consulta la sezione seguente per ulteriori dettagli.
Controllo dei contenuti multimediali
La classe v2 RemoteMediaPlayer
è deprecata e non deve essere utilizzata. In CAF, viene sostituita dalla nuova classe RemoteMediaClient
, che fornisce funzionalità equivalenti in un'API più pratica. Non è necessario inizializzare o registrare in modo esplicito questo oggetto. Il framework creerà automaticamente un'istanza dell'oggetto e registrerà il canale multimediale sottostante all'inizio della sessione se l'applicazione Web ricevitore per cui è connessa supporta lo spazio dei nomi multimediale.
È possibile accedere a RemoteMediaClient
come metodo getRemoteMediaClient
dell'oggetto CastSession
.
Nella versione 2, tutte le richieste di contenuti multimediali inviate sulla RemoteMediaPlayer
restituivano
RemoteMediaPlayer.MediaChannelResult
tramite un callback PendingResult
.
Nel CAF, tutte le richieste di contenuti multimediali emesse sulla RemoteMediaClient
restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un callback di
PendingResult
che può essere utilizzato per monitorare lo stato di avanzamento e l'esito finale della
richiesta.
La versione 2 RemoteMediaPlayer
inviava notifiche relative alle modifiche dello stato del player multimediale sul ricevitore web tramite RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF, RemoteMediaClient
fornisce callback equivalenti tramite la sua interfaccia
RemoteMediaClient.Listener
. È possibile registrare un numero illimitato di listener con RemoteMediaClient
, in modo che più componenti di mittenti possano condividere la singola istanza di RemoteMediaClient
associata alla sessione.
Nella versione v2, l'applicazione del mittente doveva assumersi l'onere di mantenere sincronizzata l'interfaccia utente con lo stato del media player sul ricevitore web.
Nel CAF, la classe UIMediaController
si assume la maggior parte di questa responsabilità.
Overlay introduttivo
V2 non fornisce un'interfaccia utente overlay introduttiva.
Il CAF fornisce una visualizzazione personalizzata
IntroductoryOverlay
per evidenziare il pulsante Trasmetti quando viene mostrato per la prima volta agli utenti.
Mini controller
Nella versione 2, devi implementare un mini controller da zero nell'app del mittente.
In CAF, l'SDK fornisce una visualizzazione personalizzata, MiniControllerFragment
, che puoi aggiungere al file di layout dell'app delle attività in cui vuoi mostrare il mini controller.
Notifica e schermata di blocco
Nella versione v2, i controller per le notifiche e la schermata di blocco non sono forniti dall'SDK. Per questo SDK, devi integrare queste funzionalità nell'app mittente utilizzando le API del framework Android.
In CAF, l'SDK fornisce un NotificationsOptions.Builder
per aiutarti a creare controlli multimediali per la notifica e la schermata di blocco nell'app del mittente. I controlli per le notifiche e la schermata di blocco possono essere abilitati con CastOptions
durante l'inizializzazione del CastContext
.
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setTargetActivityClassName(VideoBrowserActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
Controller espanso
Nella versione 2, devi implementare un controller espanso da zero nell'app del mittente.
CAF fornisce una classe di supporto UIMediaController
che semplifica la creazione di controller espansi.
CAF aggiunge un widget del controller espanso predefinito
ExpandedControllerActivity
che puoi aggiungere semplicemente alla tua app. Non devi più
implementare un controller espanso personalizzato utilizzando UIMediaController
.
Focus audio
Nella versione 2, devi utilizzare MediaSessionCompat
per gestire il focus audio.
In CAF, la messa a fuoco audio viene gestita automaticamente.
Logging del debug
Nel CAF non ci sono opzioni di logging.
App di esempio
Abbiamo tutorial codelab e app di esempio che utilizzano CAF.