La seguente procedura ti consente di convertire la tua 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 conto tuo, semplificando notevolmente lo sviluppo di un'app Cast.
Introduzione
- Il mittente CAF è ancora distribuito nell'ambito di Google Play Services usando Android SDK Manager
- Sono stati aggiunti nuovi pacchetti che si assumono la responsabilità di rispettare l'elenco di controllo di Google Cast Design (
com.google.android.gms.cast.framework.*
) - CAF Sender fornisce widget conformi ai requisiti dell'esperienza utente di Cast; la versione 2 non ha fornito componenti dell'interfaccia utente e ha richiesto di implementare questi widget.
- Non è più necessario utilizzare GoogleApiClient per utilizzare l'API Cast.
- I sottotitoli codificati in CAF Sender sono simili 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 è 9 (Gingerbread).
Inizializzazione
In CAF, è richiesto un passaggio di inizializzazione esplicito per il framework Cast. Ciò comporta l'inizializzazione del singolo CastContext
, utilizzando un OptionsProvider
appropriato per specificare l'ID applicazione Web Ricevir 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 interrotto automaticamente dal framework quando l'app passa rispettivamente in primo piano e in background. Non utilizzare MediaRouteSelector
e MediaRouter.Callback
.
Pulsante Trasmetti e finestra di dialogo Trasmetti
Come nella versione 2, questi componenti sono forniti dalla libreria di assistenza di MediaRouter.
Il pulsante Trasmetti è ancora implementato dall'MediaRouteButton
e può essere aggiunto alla tua attività (con un ActionBar
o 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 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 presentata automaticamente la finestra di dialogo Trasmetti.
Controllo dei dispositivi
In CAF, il controllo dei dispositivi è in gran parte gestito dal framework. L'applicazione mittente non ha bisogno di gestire (e non deve cercare di gestirla) la connessione al dispositivo e l'avvio dell'applicazione Web ricevitore utilizzando GoogleApiClient
. L'interazione tra mittente e ricevitore web
è ora rappresentata come una "sessione". La classe SessionManager
gestisce il ciclo di vita delle sessioni 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 viene terminata quando l'utente tocca il pulsante "Interrompi trasmissione" nella finestra di dialogo Trasmetti o quando l'app del mittente si chiude. L'applicazione
mittente può ricevere notifiche sugli eventi del ciclo di vita delle sessioni registrando un
SessionManagerListener
con SessionManager
. I callback SessionManagerListener
definiscono
i metodi di callback per tutti gli eventi del ciclo di vita delle sessioni.
Il corso CastSession
rappresenta una sessione con un dispositivo di trasmissione. La classe offre metodi per
controllare il volume e lo stato di disattivazione del dispositivo del dispositivo, operazione che in precedenza veniva eseguita nella versione v2
utilizzando i metodi su Cast.CastApi
.
Nella versione 2, i callback di Cast.Listener
fornivano notifiche relative ai cambiamenti dello stato del dispositivo, inclusi volume, stato di disattivazione dell'audio, stato in standby e così via.
Nel CAF, le notifiche relative alla modifica dello stato del volume o dell'audio vengono comunque inviate tramite metodi di callback in Cast.Listener
; questi listener sono registrati in
CastSession
.
Tutte le restanti notifiche di 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 andranno in background.
Logica di riconnessione
Come con la versione 2, CAF tenta di ristabilire le connessioni di rete che sono andate perse a causa di una perdita temporanea del segnale Wi-Fi o di altri errori di rete. Questo viene eseguito a livello di sessione: una sessione può entrare nello stato "Sospeso" quando la connessione viene persa e lo stato tornerà a essere "connesso" quando la connettività viene ripristinata. Nell'ambito della procedura, il framework si occupa di riconnettere l'applicazione Web ricevitore e 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 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 del 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 di canali personalizzati
Nella versione 2, 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 effettuata nel 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 che segue 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 esplicitamente questo oggetto; il framework creerà automaticamente un'istanza dell'oggetto e registrerà il canale multimediale sottostante all'ora di inizio della sessione se l'applicazione Web ricevitore in fase di connessione 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 sul RemoteMediaPlayer
restituiranno un RemoteMediaPlayer.MediaChannelResult
tramite un callback PendingResult
.
In CAF, tutte le richieste multimediali inviate su RemoteMediaClient
restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un callback
PendingResult
che può essere utilizzato per monitorare l'avanzamento e l'esito finale della
richiesta.
L'elemento RemoteMediaPlayer
v2 inviava notifiche relative alle modifiche dello stato del player multimediale sul ricevitore web tramite l'RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF, RemoteMediaClient
fornisce callback equivalenti tramite la sua interfaccia
RemoteMediaClient.Listener
. È possibile registrare un numero qualsiasi di listener con RemoteMediaClient
, consentendo a più componenti del mittente di condividere la singola istanza di RemoteMediaClient
associata alla sessione.
Nella versione 2, l'applicazione del mittente doveva assumersi l'onere di mantenere l'interfaccia utente sincronizzata con lo stato del media player sul web ricevitore.
Nel CAF, la classe UIMediaController
si assume la maggior parte di questa responsabilità.
Overlay introduttivo
La versione 2 non fornisce un'interfaccia utente 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 del mittente.
In CAF, l'SDK fornisce una visualizzazione personalizzata, MiniControllerFragment
, che puoi aggiungere al file di layout dell'app relativa alle 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 l'SDK in questione, devi creare queste funzionalità nell'app mittente utilizzando le API del framework Android.
In CAF, l'SDK fornisce un elemento NotificationsOptions.Builder
per aiutarti a creare controlli multimediali per la notifica e la schermata di blocco nell'app del 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 da zero un controller espanso nell'app del mittente.
CAF fornisce una classe helper UIMediaController
che semplifica la creazione del tuo controller espanso.
CAF aggiunge un widget 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 usare MediaSessionCompat
per gestire il focus audio.
Nel CAF, il focus audio viene gestito automaticamente.
Logging del debug
Nel CAF non sono disponibili opzioni di logging.
App di esempio
Abbiamo tutorial codelab e app di esempio che utilizzano CAF.