La seguente procedura ti consente di convertire la tua app mittente Android da Cast SDK v2 per il mittente CAF, basato sulla CastContext singleton.
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 lo sviluppo di un'app Google Cast.
Introduzione
- Il mittente CAF è ancora distribuito come parte di Google Play Services con 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 di Cast UX. La versione 2 non forniva componenti dell'interfaccia utente e richiedeva l'implementazione 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 (9.2.0 o versioni successive) come descritto in Funzionalità della Libreria di supporto Guida
La versione minima dell'SDK Android supportata da CAF è 9 (Gingerbread).
Inizializzazione
In CAF, è richiesto un passaggio di inizializzazione esplicito per il framework Cast. Questo
comporta l'inizializzazione
CastContext
singleton, utilizzando un'appropriata
OptionsProvider
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
nell'"applicazione" tag dell'app
AndroidManifest.xml
file:
<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
quando l'app passa in primo piano e passa in background,
rispettivamente. MediaRouteSelector
e MediaRouter.Callback
non devono essere
in uso.
Pulsante Trasmetti e finestra di dialogo Trasmetti
Come nella versione 2, questi componenti sono forniti dal supporto di MediaRouter libreria di Google.
Il pulsante Trasmetti è ancora implementato tramite
MediaRouteButton
e possono essere aggiunte alla tua attività (utilizzando
ActionBar
o un
Toolbar
),
come voce 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"/>
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 del dispositivo
In CAF, il controllo dei dispositivi è gestito in gran parte dal framework. Il mittente
non deve gestire (e non deve provare a gestirla) la connessione
il dispositivo e avviare l'applicazione WebRicevitore utilizzando
GoogleApiClient
. L'interazione tra mittente e destinatario web è ora rappresentata
come "sessione". La
SessionManager
gestisce il ciclo di vita delle sessioni e avvia e arresta automaticamente le sessioni
in risposta ai gesti dell'utente: viene avviata una sessione quando l'utente seleziona una trasmissione
dispositivo nella finestra di dialogo Trasmetti e termina quando l'utente tocca l'opzione "Interrompi trasmissione"
nella finestra di dialogo Trasmetti o quando termina l'app del mittente. Il mittente
un'applicazione può ricevere notifiche sugli eventi del ciclo di vita delle sessioni registrando
SessionManagerListener
con SessionManager
. I callback SessionManagerListener
definiscono
per tutti gli eventi del ciclo di vita delle sessioni.
La
CastSession
rappresenta una sessione con un dispositivo di trasmissione. La classe ha metodi per
il controllo del volume del dispositivo e dello stato di disattivazione audio, come in precedenza nella versione 2.
utilizzando metodi su Cast.CastApi
.
Nella versione 2,
Cast.Listener
i callback fornivano notifiche relative ai cambiamenti di stato del dispositivo, tra cui
volume, stato di disattivazione audio, stato standby e così via.
Nel CAF, le notifiche relative al cambio di stato/volume/audio vengono comunque inviate tramite callback
in Cast.Listener
; con cui questi ascoltatori sono registrati
CastSession
Tutte le altre notifiche sullo stato del dispositivo vengono inviate tramite
CastStateListener
richiamate; questi listener sono registrati su CastSession
. Assicurati di
annulla comunque la registrazione dei listener quando i frammenti, le attività o le app associati
in background.
Logica di riconnessione
Come nella versione 2, CAF tenta di ristabilire le connessioni di rete persi a causa di una perdita temporanea del segnale Wi-Fi o di altri errori di rete. Questo è a livello di sessione; una sessione può inserire uno stato "sospesa" quando la connessione si interrompe e tornerà allo stato "connesso" stato quando e la connettività viene ripristinata. Il framework si occupa di riconnettersi Web Ricevitore e la riconnessione di eventuali canali di trasmissione nell'ambito di questa procedura.
Inoltre, CAF aggiunge anche la ripresa automatica delle sessioni, che viene attivata
predefinito (e può essere disattivato tramite
CastOptions
Se l'applicazione mittente viene inviata in background o viene terminata (tramite
quando è in corso o a causa di un arresto anomalo) mentre è in corso una sessione di trasmissione,
proverà a riprendere la sessione
quando l'applicazione del mittente
torna in primo piano o viene riavviato; questa operazione viene gestita automaticamente
SessionManager
, che emetterà i callback appropriati su qualsiasi registrato
SessionManagerListener
istanze.
Registrazione a canali personalizzati
Nella versione 2, i canali personalizzati (implementati mediante
Cast.MessageReceivedCallback
)
sono registrati presso Cast.CastApi
. Nel CAF, i canali personalizzati vengono invece registrati con
CastSession
istanza. La registrazione può essere effettuata nella
SessionManagerListener.onSessionStarted
. Per le applicazioni multimediali, non è più necessario specificare
registrare il canale di controllo multimediale tramite Cast.CastApi.setMessageReceivedCallbacks
;
consulta la sezione che segue per ulteriori dettagli.
Controllo dei contenuti multimediali
Il corso v2
RemoteMediaPlayer
è deprecato e non deve essere utilizzato. In CAF, viene sostituito dal nuovo
RemoteMediaClient
, che fornisce funzionalità equivalenti in un'API più comoda. È
non necessario per inizializzare o registrare esplicitamente questo oggetto; il framework
crea automaticamente un'istanza dell'oggetto e registra i contenuti multimediali sottostanti
il canale all'ora di inizio della sessione se l'applicazione Web receiver viene 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 emesse sulla RemoteMediaPlayer
restituivano un
RemoteMediaPlayer.MediaChannelResult
tramite chiamata PendingResult
.
In CAF, tutte le richieste di contenuti multimediali emesse il RemoteMediaClient
restituiscono un
RemoteMediaClient.MediaChannelResult
tramite un
PendingResult
che può essere utilizzato per monitorare l'avanzamento e il risultato finale
richiesta.
La versione 2 RemoteMediaPlayer
invia notifiche relative ai cambiamenti nei contenuti multimediali
lo stato del player sul ricevitore web tramite
RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF, RemoteMediaClient
fornisce callback equivalenti tramite il suo
RemoteMediaClient.Listener
a riga di comando. È possibile registrare un numero qualsiasi di listener con il
RemoteMediaClient
, che consente a più componenti di mittenti di condividere
singola istanza di RemoteMediaClient
associata alla sessione.
Nella versione v2, l'applicazione del mittente doveva assumersi l'onere di mantenere l'utente sincronizzata con lo stato del media player sul ricevitore web.
Nel CAF, il corso
UIMediaController
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 mettere in evidenza il pulsante
Trasmetti quando viene mostrato agli utenti per la prima volta.
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 potete aggiungere al file di layout delle app delle attività in cui
che vuoi mostrare al 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 l'SDK, devi integrare queste funzionalità nell'app del mittente utilizzando API Android Framework.
In CAF, l'SDK fornisce una
NotificationsOptions.Builder
per creare controlli multimediali per le notifiche e la schermata di blocco
nell'app del mittente. È possibile attivare i controlli per le notifiche e la schermata di blocco
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 v2, devi implementare un controller espanso da zero l'app del mittente.
Il CAF fornisce un
UIMediaController
una classe di supporto che ti permette di creare facilmente
un controller di deployment.
CAF aggiunge un widget controller espanso predefinito
ExpandedControllerActivity
che puoi aggiungere alla tua app. Non è più necessario
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.