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 cicli di vita, errori e callback per te, semplificando notevolmente lo sviluppo di un'app Cast.
Introduzione
- CAF Sender viene ancora distribuito nell'ambito di Google Play Services utilizzando 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 v2 non forniva componenti UI e richiedeva l'implementazione di questi widget.
- L'utilizzo di GoogleApiClient non è più necessario per utilizzare l'API Cast.
- Il sottotitolaggio codificato in CAF Sender è simile alla versione 2.
Dipendenze
V2 e CAF hanno le stesse dipendenze dalle librerie di supporto e da Google Play Services (9.2.0 o versioni successive) come descritto nella Guida alle funzionalità della libreria di supporto.
La versione minima dell'SDK Android supportata da CAF è la 9 (Gingerbread).
Inizializzazione
In CAF, è necessario un passaggio di inizializzazione esplicito per il framework Cast. Ciò
comporta l'inizializzazione del
singleton CastContext
, utilizzando un
OptionsProvider
appropriato per specificare l'ID applicazione Web Receiver e qualsiasi altra opzione globale.
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
all'interno del 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 in modo differito 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, la procedura di rilevamento viene avviata e interrotta automaticamente dal
framework quando l'app viene portata in primo piano e sullo sfondo,
rispettivamente. MediaRouteSelector
e MediaRouter.Callback
non devono essere
utilizzati.
Pulsante Trasmetti e finestra di dialogo Trasmetti
Come nella v2, questi componenti sono forniti dalla libreria di supporto MediaRouter.
Il pulsante Trasmetti è ancora implementato da
MediaRouteButton
e può essere aggiunto alla tua attività (utilizzando un
ActionBar
o un
Toolbar
),
come voce di 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"/>
Esegui l'override del metodo onCreateOptionMenu()
di ogni attività utilizzando
CastButtonFactory
per collegare MediaRouteButton
al framework Cast:
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 dei dispositivi
In CAF, il controllo dei dispositivi è gestito in gran parte dal framework. L'applicazione
mittente non deve gestire (e non deve tentare di gestire) la connessione al
dispositivo e l'avvio dell'applicazione Web Receiver utilizzando
GoogleApiClient
. L'interazione tra il mittente e il ricevitore web ora è rappresentata
come una "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 l'app mittente stessa termina. L'applicazione
mittente può ricevere notifiche degli eventi del ciclo di vita della sessione registrando un
SessionManagerListener
con SessionManager
. I callback SessionManagerListener
definiscono
i metodi di callback per tutti gli eventi del ciclo di vita della sessione.
La classe
CastSession
rappresenta una sessione con un dispositivo Cast. La classe ha metodi per
controllare il volume e gli stati di disattivazione dell'audio del dispositivo, cosa che in precedenza veniva fatta nella v2
utilizzando i metodi di Cast.CastApi
.
Nella versione 2, i
Cast.Listener
callback fornivano notifiche delle modifiche allo stato del dispositivo, tra cui
volume, stato di disattivazione dell'audio, stato di standby e così via.
In CAF, le notifiche di modifica dello stato di volume/silenzio vengono ancora inviate tramite metodi di callback in Cast.Listener
; questi listener sono registrati con CastSession
.
Tutte le altre notifiche di stato del dispositivo vengono inviate tramite
callback CastStateListener
; questi listener sono registrati con CastSession
. Assicurati di
annullare la registrazione dei listener quando i fragment, le attività o le app associati passano
in background.
Logica di riconnessione
Come per la versione 2, CAF tenta di ristabilire le connessioni di rete interrotte a causa della perdita temporanea del segnale Wi-Fi o di altri errori di rete. Ora questa operazione viene eseguita a livello di sessione; una sessione può entrare in uno stato "sospeso" quando la connessione viene persa e tornerà allo stato "connesso" quando la connettività viene ripristinata. Il framework si occupa di riconnettersi all'applicazione Web Receiver e di riconnettere tutti i canali di trasmissione nell'ambito di questa procedura.
Inoltre, CAF aggiunge anche la ripresa automatica della sessione, che è abilitata per
impostazione predefinita (e può essere disattivata tramite
CastOptions
.
Se l'applicazione mittente viene inviata in background o viene terminata (tramite
scorrimento o a causa di un arresto anomalo) mentre è in corso una sessione di trasmissione, il
framework tenterà di riprendere la sessione quando l'applicazione mittente
torna in primo piano o viene riavviata. Questa operazione viene gestita automaticamente da
SessionManager
, che emetterà i callback appropriati su qualsiasi istanza SessionManagerListener
registrata.
Registrazione del canale personalizzato
Nella versione 2, i canali personalizzati (implementati utilizzando
Cast.MessageReceivedCallback
)
vengono registrati con Cast.CastApi
. In CAF, i canali personalizzati vengono registrati con l'istanza
CastSession
. La registrazione può essere eseguita nel metodo di callback
SessionManagerListener.onSessionStarted
. Per le applicazioni multimediali, non è più necessario registrare
esplicitamente il canale di controllo multimediale tramite Cast.CastApi.setMessageReceivedCallbacks
;
per maggiori dettagli, consulta la sezione seguente.
Controllo dei contenuti multimediali
La classe v2
RemoteMediaPlayer
è deprecata e non deve essere utilizzata. Nel CAF, è sostituita dalla nuova classe
RemoteMediaClient
, che fornisce funzionalità equivalenti in un'API più comoda. Non è necessario inizializzare o registrare esplicitamente questo oggetto. Il framework istanzierà automaticamente l'oggetto e registrerà il canale multimediale sottostante all'ora di inizio della sessione se l'applicazione Web Receiver a cui è connesso 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 emesse il giorno RemoteMediaPlayer
restituiranno un
RemoteMediaPlayer.MediaChannelResult
tramite un callback PendingResult
.
In CAF, tutte le richieste di contenuti multimediali emesse il giorno RemoteMediaClient
restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un
PendingResult
callback che può essere utilizzato per monitorare l'avanzamento e l'esito finale della
richiesta.
La v2 di RemoteMediaPlayer
inviava notifiche sulle modifiche dello stato del lettore multimediale sul Web Receiver tramite RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF, RemoteMediaClient
fornisce callback equivalenti tramite la sua interfaccia
RemoteMediaClient.Listener
. È possibile registrare un numero qualsiasi di listener con
RemoteMediaClient
, il che consente a più componenti mittente di condividere la
singola istanza di RemoteMediaClient
associata alla sessione.
Nella v2, l'applicazione mittente doveva farsi carico di mantenere sincronizzata l'interfaccia utente con lo stato del media player sul Web Receiver.
In CAF, la classe
UIMediaController
si assume la maggior parte di questa responsabilità.
Overlay introduttivo
La versione 2 non fornisce un'interfaccia utente di overlay introduttiva.
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 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.
Notifiche e schermata di blocco
Nella versione 2, i controlli per le notifiche e la schermata di blocco non sono forniti dall'SDK. Per questo SDK, devi integrare queste funzionalità nella tua 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 mittente. I controlli di notifica e schermata di blocco possono essere attivati
con
CastOptions
durante l'inizializzazione di 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 mittente.
CAF fornisce una
UIMediaController
classe helper che semplifica la creazione di un controller espanso
personalizzato.
CAF aggiunge un widget del controller espanso predefinito
ExpandedControllerActivity
che puoi semplicemente aggiungere alla tua app. Non è più necessario
implementare un controller espanso personalizzato utilizzando UIMediaController
.
Focus audio
Nella versione 2, devi utilizzare MediaSessionCompat
per gestire la messa a fuoco dell'audio.
In CAF, la messa a fuoco audio viene gestita automaticamente.
Logging del debug
In CAF non sono disponibili opzioni di logging.
App di esempio
Abbiamo tutorial codelab e app di esempio che utilizzano CAF.