Eseguire la migrazione dell'app Android Sender dall'SDK Cast v2 a Cast Application Framework (CAF)

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.