La seguente procedura consente di convertire l'app mittente Android da Cast SDK v2 a CAF Sender, che si basa sul CastContext singleton.
L'SDK mittente Cast CAF utilizza CastContext per gestire GoogleAPIClient per tuo conto. CastContext gestisce i cicli di vita, gli errori e i callback per te, il che semplifica notevolmente lo sviluppo di un'app Cast.
Introduzione
- Il mittente CAF viene ancora distribuito come parte di Google Play Services utilizzando SDK Android Manager
- Sono stati aggiunti nuovi pacchetti che si assumono la responsabilità di rispettare la checklist di progettazione di Google Cast (
com.google.android.gms.cast.framework.*) - Il mittente CAF fornisce widget conformi ai requisiti dell'esperienza utente di Cast; v2 non forniva componenti dell'interfaccia utente e richiedeva di implementare questi widget.
- L'utilizzo di GoogleApiClient non è più necessario per utilizzare l'API Cast.
- I sottotitoli codificati nel mittente CAF sono simili a quelli di v2.
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 è 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 dell'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 in v2.
Rilevamento dispositivi
In CAF, il processo di rilevamento viene avviato e arrestato automaticamente dal framework quando l'app passa in primo piano e in background, rispettivamente. MediaRouteSelector e MediaRouter.Callback non devono essere utilizzati.
Pulsante Trasmetti e finestra di dialogo Trasmetti
Come in v2, questi componenti sono forniti dalla libreria di supporto MediaRouter.
Il pulsante Trasmetti viene ancora implementato da MediaRouteButton e può essere aggiunto all'attività (utilizzando un ActionBar o una 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"/>
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 un utente 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 mittente e Web Receiver è ora rappresentata come una "sessione". La
SessionManager
classe gestisce il ciclo di vita della sessione e avvia e arresta automaticamente le sessioni
in risposta ai gesti dell'utente: una sessione viene avviata quando l'utente seleziona un dispositivo Cast
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 una notifica 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
CastSession
classe rappresenta una sessione con un dispositivo di trasmissione. La classe ha metodi per controllare il volume e lo stato di disattivazione dell'audio del dispositivo, che in precedenza veniva eseguito in v2 utilizzando i metodi di Cast.CastApi.
In v2, i
Cast.Listener
callback fornivano notifiche delle modifiche allo stato del dispositivo, inclusi
volume, stato di disattivazione dell'audio, stato di standby e così via.
In CAF, le notifiche di modifica dello stato di volume/disattivazione dell'audio vengono ancora inviate tramite i metodi di callback
in Cast.Listener; questi listener vengono registrati con
CastSession.
Tutte le notifiche sullo stato del dispositivo rimanenti vengono inviate tramite
CastStateListener
callback; questi listener vengono registrati con CastSession. Assicurati di annullare la registrazione dei listener quando i frammenti, le attività o le app associati passano in background.
Logica di riconnessione
Come per v2, 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 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 Cast nell'ambito di questo processo.
Inoltre, CAF aggiunge anche la ripresa automatica della sessione, che è attivata per impostazione predefinita (e può essere disattivata tramite
CastOptions.
Se l'applicazione mittente viene inviata in background o terminata (tramite
scorrimento o a causa di un arresto anomalo) mentre è in corso una sessione Cast, 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 tutte le istanze registrate
SessionManagerListener.
Registrazione del canale personalizzato
In v2, i canali personalizzati (implementati utilizzando
Cast.MessageReceivedCallback)
vengono registrati con Cast.CastApi. In CAF, i canali personalizzati vengono invece registrati con l'istanza CastSession. La registrazione può essere eseguita nel
SessionManagerListener.onSessionStarted
metodo di callback. 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
è obsoleta e non deve essere utilizzata. In CAF, viene sostituita dalla nuova
RemoteMediaClient
classe, che fornisce funzionalità equivalenti in un'API più pratica. Non è necessario inizializzare o registrare esplicitamente questo oggetto; il framework creerà automaticamente un'istanza dell'oggetto e registrerà il canale multimediale sottostante all'avvio della sessione se l'applicazione Web Receiver a cui è connessa supporta lo spazio dei nomi multimediali.
È possibile accedere a RemoteMediaClient come metodo
getRemoteMediaClient dell'oggetto CastSession.
In v2, tutte le richieste multimediali emesse su RemoteMediaPlayer restituivano un
RemoteMediaPlayer.MediaChannelResult tramite un PendingResult callback.
In CAF, tutte le richieste multimediali emesse su RemoteMediaClient restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un
PendingResult
callback che può essere utilizzato per monitorare l'avanzamento e l'esito finale della
richiesta.
La classe v2 RemoteMediaPlayer inviava notifiche sulle modifiche dello stato del player multimediale su Web Receiver tramite
RemoteMediaPlayer.OnStatusUpdatedListener.
In CAF, the RemoteMediaClient fornisce callback equivalenti tramite la sua
RemoteMediaClient.Listener
interfaccia. È possibile registrare un numero qualsiasi di listener con RemoteMediaClient, il che consente a più componenti mittenti di condividere la singola istanza di RemoteMediaClient associata alla sessione.
In v2, l'applicazione mittente doveva farsi carico di mantenere l'interfaccia utente sincronizzata con lo stato del player multimediale su Web Receiver.
In CAF, la classe
UIMediaController
si assume la maggior parte di questa responsabilità.
Overlay introduttivo
V2 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
In v2, 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
In 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 integrare i controlli multimediali per le notifiche e la schermata di blocco
nell'app mittente. I controlli delle notifiche e della schermata di blocco possono essere attivati
con le
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
In v2, 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
In v2, devi utilizzare MediaSessionCompat per gestire il focus audio.
In CAF, il focus audio viene gestito automaticamente.
Logging del debug
In CAF non sono disponibili opzioni di logging.
Esempi di app
Abbiamo tutorial codelab ed esempi di app che utilizzano CAF.