La procedura seguente ti consente di convertire l'app di invio per Android dal Cast SDK v2 a CAF Sender, che si basa sull'oggetto singolo CastContext.
L'SDK Cast CAF Sender utilizza CastContext per gestire GoogleAPIClient per tuo conto. CastContext gestisce i cicli di vita, gli errori e i callback per te, semplificando notevolmente lo sviluppo di un'app per la trasmissione.
Introduzione
- CAF Sender viene ancora distribuito nell'ambito di Google Play Services utilizzando il gestore dell'SDK Android
- Sono stati aggiunti nuovi pacchetti che si assumono la responsabilità della conformità all'elenco di controllo del design di Google Cast (
com.google.android.gms.cast.framework.*
) - CAF Sender fornisce widget conformi ai requisiti dell'esperienza utente di Google Cast. La versione 2 non forniva componenti dell'interfaccia utente e richiedeva l'implementazione di questi widget.
- L'utilizzo di GoogleApiClient non è più necessario per l'utilizzo dell'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à delle librerie 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. Questo
involve l'inizializzazione del
CastContext
singleton, utilizzando un
OptionsProvider
appropriato per specificare l'ID applicazione del ricevitore web e 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
all'interno del tag "application" del fileAndroidManifest.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 lazy 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 interrotto automaticamente dal framework quando l'app viene visualizzata in primo piano e sullo sfondo. 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 MediaRouter.
Il pulsante Trasmetti è ancora implementato da MediaRouteButton
e può essere aggiunto alla tua attività (utilizzando ActionBar
o Toolbar
) come elemento del 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 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 del dispositivo è gestito in gran parte dal framework. L'applicazione di invio 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 destinatario web è ora rappresentata come "sessione". La classe
SessionManager
gestisce il ciclo di vita delle sessioni e le avvia e interrompe automaticamente
in risposta ai gesti dell'utente: una sessione viene avviata quando l'utente seleziona un dispositivo di trasmissione nella finestra di dialogo Trasmissione e termina quando l'utente tocca il pulsante "Interrompi trasmissione" nella finestra di dialogo Trasmissione o quando termina l'app mittente stessa. L'applicazione di invio può ricevere una notifica degli eventi del ciclo di vita della sessione registrando un SessionManagerListener
con il SessionManager
. I callback SessionManagerListener
definiscono metodi callback per tutti gli eventi del ciclo di vita della sessione.
La classe
CastSession
rappresenta una sessione con un dispositivo di trasmissione. La classe dispone di metodi per controllare il volume e gli stati di disattivazione audio del dispositivo, come avveniva in precedenza nella versione 2 utilizzando i metodi su Cast.CastApi
.
Nella versione 2, i callback
Cast.Listener
fornivano notifiche delle modifiche allo stato del dispositivo, tra cui volume, stato di disattivazione audio, stato di standby e così via.
In CAF, le notifiche relative alla modifica dello stato del volume/della disattivazione dell'audio vengono comunque inviate tramite metodi di callback nel Cast.Listener
; questi ascoltatori sono registrati con CastSession
.
Tutte le altre notifiche relative allo stato del dispositivo vengono inviate tramite callback
CastStateListener
.
Questi ascoltatori sono registrati con CastSession
. Assicurati di
ancora annullare la registrazione degli ascoltatori quando i frammenti, le attività o le app associati passano
in background.
Logica di ricollegamento
Come per la versione 2, CAF tenta di ristabilire le connessioni di rete che vengono perse a causa della perdita temporanea del segnale Wi-Fi o di altri errori di rete. Ora questo viene eseguito 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 ricollegare l'applicazione Web Receiver e tutti i canali di trasmissione come parte 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 chiusa (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 tornerà in primo piano o verrà riavviata. Questa operazione viene gestita automaticamente da SessionManager
, che emette i callback appropriati su tutte le istanze SessionManagerListener
registrate.
Registrazione di canali personalizzati
Nella versione 2, i canali personalizzati (implementati utilizzando
Cast.MessageReceivedCallback
)
vengono registrati con Cast.CastApi
. In CAF, i canali personalizzati vengono registrati con l'istanzaCastSession
. La registrazione può essere eseguita nel metodo callback
SessionManagerListener.onSessionStarted
. Per le applicazioni multimediali, non è più necessario registrare esplicitamente il canale di controllo multimediale tramite Cast.CastApi.setMessageReceivedCallbacks
. Per ulteriori dettagli, consulta la sezione seguente.
Controllo dei contenuti multimediali
La classe v2
RemoteMediaPlayer
è stata ritirata e non deve essere utilizzata. In 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 creerà 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 multimediali.
Puoi accedere a RemoteMediaClient
come metodo getRemoteMediaClient
dell'oggetto CastSession
.
Nella versione 2, tutte le richieste di contenuti multimediali inviate su RemoteMediaPlayer
restituivano un
RemoteMediaPlayer.MediaChannelResult
tramite un callback PendingResult
.
In CAF, tutte le richieste di contenuti multimediali inviate su RemoteMediaClient
restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un callback
PendingResult
che può essere utilizzato per monitorare l'avanzamento e l'eventuale esito della
richiesta.
La versione 2 di RemoteMediaPlayer
inviava notifiche relative alle modifiche dello stato del media player sul ricevitore web tramite RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF, RemoteMediaClient
fornisce callback equivalenti tramite la sua interfaccia
RemoteMediaClient.Listener
. È possibile registrare un numero qualsiasi di ascoltatori con RemoteMediaClient
, il che consente a più componenti di invio di condividere la singola istanza di RemoteMediaClient
associata alla sessione.
Nella versione 2, l'applicazione mittente doveva occuparsi di mantenere sincronizzata l'interfaccia utente con lo stato del media player sul ricevitore web.
In CAF, la classe
UIMediaController
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 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 mittente. I controlli della notifica e della schermata di blocco possono essere attivati
con il
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 mittente.
CAF fornisce una
UIMediaController
classe di supporto che ti consente di creare facilmente il tuo controller espanso.
CAF aggiunge un widget di controllo espanso predefinito
ExpandedControllerActivity
che puoi semplicemente aggiungere alla tua app. Non è più necessario
implementare un controllo espanso personalizzato utilizzando UIMediaController
.
Focus audio
Nella versione 2, devi utilizzare MediaSessionCompat
per gestire l'attenzione audio.
In CAF, l'attenzione audio viene gestita automaticamente.
Logging del debug
In CAF non sono disponibili opzioni di registrazione.
App di esempio
Abbiamo tutorial di codelab e app di esempio che utilizzano CAF.