Esegui la migrazione dell'app mittente Android da Cast SDK v2 a Cast Application Framework (CAF)

La seguente procedura consente di convertire l'app del mittente Android da Cast SDK v2 a Mittente CAF, che è basato sul Singleton CastContext.

L'SDK Cast CAF Trasmettitore utilizza CastContext per gestire il client GoogleAPI per tuo conto. CastContext gestisce automaticamente cicli di vita, errori e callback, semplificando notevolmente lo sviluppo di un'app Cast.

Introduzione

  • Mittente CAF viene ancora distribuito come parte di Google Play Services utilizzando 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.*)
  • Mittente CAF fornisce widget conformi ai requisiti dell'esperienza utente Cast; v2 non fornisce componenti dell'interfaccia utente e richiede l'implementazione di questi widget.
  • L'utilizzo di GoogleApiClient non è più obbligatorio per l'utilizzo dell'API Cast.
  • I sottotitoli in CAF Sender sono simili a quelli della versione 2.

Dipendenze

V2 e CAF hanno le stesse dipendenze dalle librerie di assistenza e dai servizi Google Play (9.2.0 o versioni successive) come descritto nella Guida alle funzionalità della libreria di assistenza

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 comporta l'inizializzazione del singleton CastContext, utilizzando un OptionsProvider appropriato per specificare l'ID dell'applicazione Ricevitore web e altre eventuali 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 l'elemento 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 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 in primo piano e passa in background, MediaRouteSelector e MediaRouter.Callback non devono essere utilizzati.

Pulsante Trasmetti e finestra di dialogo Trasmetti

Come nella versione v2, questi componenti sono forniti dalla libreria di supporto di MediaRouter.

Il pulsante Trasmetti è ancora implementato da MediaRouteButton e può essere aggiunto alla tua attività (utilizzando un ActionBar o un 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"/>

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 dispositivo

In CAF, il controllo dei dispositivi è gestito in gran parte dal framework. L'applicazione del mittente non deve gestire (e non deve provare a gestire) la connessione al dispositivo e avviare l'applicazione Ricevitore web utilizzando GoogleApiClient. L'interazione tra il mittente e il ricevitore web è ora rappresentata come una "sessione". La classe SessionManager gestisce il ciclo di vita della sessione 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 termina quando l'utente tocca il pulsante "Interrompi trasmissione" nella finestra di dialogo Trasmetti o quando l'app mittente termina. L'applicazione del mittente può ricevere una notifica degli eventi del ciclo di vita della sessione registrando una SessionManagerListener con il 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 dispone di metodi per controllare il volume del dispositivo e gli stati di disattivazione, che in precedenza erano eseguiti nella versione v2 utilizzando i metodi su Cast.CastApi.

Nella versione 2, i callback Cast.Listener hanno fornito notifiche relative alle modifiche allo stato del dispositivo, inclusi volume, disattivazione audio, stato in standby e così via.

Nel CAF, le notifiche di modifica dello stato del volume/disattivazione audio vengono comunque inviate tramite metodi di callback in Cast.Listener; questi ascoltatori vengono registrati con CastSession. Tutte le rimanenti notifiche relative allo stato del dispositivo vengono recapitate tramite i callback CastStateListener; questi ascoltatori sono registrati con la modalità CastSession. Assicurati di annullare la registrazione degli ascoltatori quando i frammenti, le attività o le app associati passano in background.

Logica di riconnessione

Come per la versione v2, il CAF tenta di ristabilire le connessioni di rete perse a causa di una perdita temporanea di 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 interrotta e tornerà allo stato "connesso" quando la connessione viene ripristinata. Il framework si connette nuovamente all'applicazione Ricevitore web e a qualsiasi altro canale di trasmissione nell'ambito della procedura.

Il 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 terminata (scorrendo verso l'esterno o a causa di un arresto anomalo) mentre è in corso una sessione di trasmissione, il framework proverà a riprendere quella sessione quando l'applicazione del mittente torna in primo piano o viene riavviata; il tutto viene gestito automaticamente dalla SessionManager, che emetterà i callback appropriati su qualsiasi istanza SessionManagerListener registrata.

Registrazione personalizzata ai canali

Nella versione 2, i canali personalizzati (implementati utilizzando Cast.MessageReceivedCallback) sono registrati alla Cast.CastApi. In CAF, i canali personalizzati sono registrati nell'istanza CastSession. La registrazione può essere effettuata nel metodo di callback SessionManagerListener.onSessionStarted. Per le applicazioni multimediali, non è più necessario registrare esplicitamente il canale di controllo dei contenuti multimediali tramite Cast.CastApi.setMessageReceivedCallbacks; consulta la seguente sezione per ulteriori dettagli.

Controllo dei contenuti multimediali

La classe v2 RemoteMediaPlayer è deprecata 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 un'istanza dell'oggetto e registrerà il canale multimediale sottostante all'ora di inizio della sessione se l'applicazione webRicevitore a cui è collegato supporta lo spazio dei nomi dei contenuti multimediali.

RemoteMediaClient è accessibile come metodo getRemoteMediaClient dell'oggetto CastSession.

Nella versione 2, tutte le richieste di contenuti multimediali emesse su RemoteMediaPlayer restituiscono un RemoteMediaPlayer.MediaChannelResult tramite un callback PendingResult.

In CAF, tutte le richieste di contenuti multimediali emesse sul RemoteMediaClient restituiscono un RemoteMediaClient.MediaChannelResult tramite un PendingResult callback che può essere utilizzato per monitorare lo stato di avanzamento e l'esito finale della richiesta.

La versione 2 RemoteMediaPlayer invierà notifiche sui cambiamenti relativi allo stato del media player sul ricevitore web tramite il RemoteMediaPlayer.OnStatusUpdatedListener.

Nel CAF, RemoteMediaClient fornisce callback equivalenti tramite la sua interfaccia RemoteMediaClient.Listener. È possibile registrare un numero qualsiasi di ascoltatori con il RemoteMediaClient, che consente a più componenti di mittenti di condividere la singola istanza di RemoteMediaClient associata alla sessione.

Nella versione 2, l'applicazione del mittente doveva assumere il compito di mantenere l'interfaccia utente sincronizzata con lo stato del lettore multimediale sul ricevitore web.

Nel CAF, il corso UIMediaController si assume la maggior parte di questa responsabilità.

Overlay introduttivo

V2 non fornisce un'interfaccia utente introduttiva di overlay.

Il CAF offre 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 offre una visualizzazione personalizzata, MiniControllerFragment, che puoi aggiungere al file di layout dell'app delle attività in cui vuoi mostrare il mini controller.

Notifica e schermata di blocco

Nella v2, i controller per le notifiche e la schermata di blocco non vengono forniti dall'SDK. Per questo SDK devi creare queste funzionalità nell'app del mittente utilizzando le API del framework Android.

Nel CAF, l'SDK fornisce NotificationsOptions.Builder per aiutarti a creare controlli multimediali per la notifica e la schermata di blocco nell'app del mittente. I controlli della schermata di notifica e di blocco possono essere attivati con CastOptions all'inizializzazione dell'elemento 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 del mittente.

CAF fornisce una classe helper di UIMediaController che semplifica la creazione del proprio 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 utilizzare MediaSessionCompat per gestire il focus audio.

In CAF, l'impostazione audio è gestita automaticamente.

Logging del debug

In CAF non sono disponibili opzioni di logging.

App di esempio

Abbiamo tutorial su codelab e app di esempio che utilizzano il CAF.