Migra la app Sender de Android del SDK de Cast v2 al framework de aplicaciones de Cast (CAF)

El siguiente procedimiento te permite convertir tu app emisora de Android desde Cast SDK v2 para remitente de CAF, que se basa en el CastContext singleton.

El SDK de Cast CAF Sender usa CastContext para administrar GoogleAPIClient en tu nombre. CastContext administra ciclos de vida, errores y devoluciones de llamada por ti, lo que en gran medida simplifica el desarrollo de una app de Cast.

Introducción

  • CAF Sender se sigue distribuyendo como parte de Google Play Services. con SDK Manager de Android
  • Se agregaron nuevos paquetes que asumen la responsabilidad de cumplir con la lista de tareas de diseño de Google Cast (com.google.android.gms.cast.framework.*)
  • El remitente de CAF proporciona widgets que cumplen con los requisitos de UX de Cast. v2 no proporcionaba ningún componente de IU y era necesario que lo implementaras. widgets.
  • Ya no es necesario usar GoogleApiClient para utilizar la API de Cast.
  • Los subtítulos en CAF Sender son similares a los de la versión 2.

Dependencias

V2 y CAF tienen las mismas dependencias en las bibliotecas de compatibilidad y en Google Play de Google Cloud (9.2.0 o versiones posteriores), como se describe en las Funciones de la biblioteca de compatibilidad Guía

La versión mínima del SDK de Android que admite CAF es 9 (Gingerbread).

Inicialización

En CAF, se requiere un paso de inicialización explícito para el framework de Cast. Esta consiste en inicializar el CastContext singleton con un atributo OptionsProvider para especificar el ID de aplicación del receptor web y cualquier otra opción global.

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;
    }
}

Declara el OptionsProvider dentro de la “aplicación”. etiqueta de la aplicación Archivo AndroidManifest.xml:

<application>
...
    <meta-data
        android:name=
            "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>

Inicializa de forma diferida CastContext en el método onCreate de cada Activity:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

Estos pasos no eran necesarios en la v2.

Cómo detectar dispositivos

En CAF, el proceso de detección se inicia y se detiene automáticamente cuando la app pasa a primer plano y a segundo plano, respectivamente. MediaRouteSelector y MediaRouter.Callback no deben ser que se usan.

Botón para transmitir y diálogo de transmisión

Al igual que en la v2, estos componentes los proporciona el equipo de asistencia de MediaRouter biblioteca.

El botón para transmitir aún se implementa en MediaRouteButton y se pueden agregar a tu actividad (mediante un ActionBar o un Toolbar), como elemento de menú de tu menú.

<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"/>

Anula el método onCreateOptionMenu() de cada actividad usando CastButtonFactory Para conectar MediaRouteButton al framework de Cast, haz lo siguiente:

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;
}

Cuando alguien presione el botón, se presentará automáticamente el diálogo para transmitir.

Control de dispositivos

En CAF, el control de dispositivos lo controla en gran medida el framework. El remitente no necesita controlar (y no debería intentar controlar) la conexión a el dispositivo e iniciar la aplicación del receptor web con GoogleApiClient Ahora se representa la interacción entre el remitente y el receptor web como una "sesión". El SessionManager la clase controla el ciclo de vida de la sesión e inicia y detiene las sesiones automáticamente En respuesta a los gestos del usuario: se inicia una sesión cuando el usuario selecciona una transmisión dispositivo en el diálogo de transmisión y finaliza cuando el usuario presiona "Detener transmisión" en el diálogo de transmisión o cuando se cierre la app emisora. El remitente puede notificarse sobre los eventos del ciclo de vida de la sesión registrando un SessionManagerListener con el SessionManager. Las devoluciones de llamada de SessionManagerListener definen métodos de devolución de llamada para todos los eventos de ciclo de vida de la sesión.

El CastSession representa una sesión con un dispositivo de transmisión. La clase tiene métodos para controlar el volumen y los estados de silencio del dispositivo, lo cual se hacía anteriormente en la v2 con métodos en Cast.CastApi

En la versión 2, Cast.Listener las devoluciones de llamada proporcionaron notificaciones de cambios en el estado del dispositivo, lo que incluye volumen, estado silenciado, estado en espera, etcétera.

En CAF, las notificaciones sobre cambios de volumen o silencio se siguen entregando mediante devolución de llamada métodos en Cast.Listener; estos objetos de escucha están registrados con CastSession Todas las notificaciones restantes sobre el estado del dispositivo se envían a través de CastStateListener devoluciones de llamada; estos objetos de escucha se registran con CastSession. Asegúrate de cancelar el registro de los objetos de escucha cuando se dejan de usar los fragmentos, las actividades o las apps en segundo plano.

Lógica de reconexión

Al igual que con v2, el CAF intenta restablecer las conexiones de red que se pierden debido a una pérdida temporal de la señal de Wi-Fi o a otros errores de red. Ahora es se realiza a nivel de sesión; una sesión puede entrar en estado "suspendido" cuando el estado se pierde la conexión y vuelve a cambiar a una conexión “conectada” para indicar cuándo se restablece la conectividad. El framework se encarga de volver a conectarse al Aplicación receptora web y volver a conectar cualquier canal de transmisión como parte de este proceso.

Además, el CAF también agrega la reanudación automática de la sesión, que se habilita mediante de forma predeterminada (y se puede desactivar mediante CastOptions Si la aplicación emisora se envía a segundo plano o se cierra (por deslizarse o debido a una falla) mientras hay una sesión de transmisión en curso, el el framework intentará reanudar esa sesión cuando la aplicación emisora vuelve al primer plano o se reinicia; esto se controla automáticamente SessionManager, que emitirá las devoluciones de llamada adecuadas en todas las instancias registradas SessionManagerListener instancias.

Registro de canales personalizados

En la v2, los canales personalizados (implementados con Cast.MessageReceivedCallback) están registrados en la Cast.CastApi. En CAF, los canales personalizados se registran Instancia CastSession. El registro puede hacerse en SessionManagerListener.onSessionStarted de devolución de llamada. Para las aplicaciones de medios, ya no es necesario explícitamente registrar el canal de control de contenido multimedia a través de Cast.CastApi.setMessageReceivedCallbacks consulta la siguiente sección para obtener más detalles.

Control multimedia

La clase v2 RemoteMediaPlayer está obsoleto y no debe usarse. En CAF, se sustituye por el nuevo RemoteMediaClient que proporciona una funcionalidad equivalente en una API más conveniente. Sí no es necesario inicializar o registrar de manera explícita este objeto; el framework creará automáticamente una instancia del objeto y registrará el contenido multimedia subyacente a la hora de inicio de la sesión si la aplicación del receptor web a la que se conecta admite el espacio de nombres de medios.

Se puede acceder a RemoteMediaClient como el Método getRemoteMediaClient del objeto CastSession.

En la v2, todas las solicitudes de contenido multimedia emitidas en el RemoteMediaPlayer mostrarían un RemoteMediaPlayer.MediaChannelResult mediante una devolución de llamada PendingResult

En CAF, todas las solicitudes de contenido multimedia emitidas en RemoteMediaClient muestran un RemoteMediaClient.MediaChannelResult mediante un PendingResult que se puede usar para hacer un seguimiento del progreso y el resultado final para cada solicitud.

La versión 2 RemoteMediaPlayer enviaría notificaciones sobre cambios en el contenido multimedia del reproductor en el receptor web a través del RemoteMediaPlayer.OnStatusUpdatedListener

En CAF, RemoteMediaClient proporciona devoluciones de llamada equivalentes a través de su RemoteMediaClient.Listener interfaz de usuario. Cualquier cantidad de objetos de escucha puede registrarse con el RemoteMediaClient, que permite que varios componentes del remitente compartan el única instancia de RemoteMediaClient asociada con la sesión.

En la v2, la aplicación emisora tenía que encargarse de mantener al usuario sincronizada con el estado del reproductor multimedia en el receptor web.

En CAF, la clase UIMediaController asume la mayor parte de esta responsabilidad.

Superposición introductoria

V2 no proporciona una IU de superposición introductoria.

El CAF proporciona una vista personalizada IntroductoryOverlay para destacar el botón para transmitir cuando se muestra a los usuarios por primera vez.

Minicontrolador

En la v2, debes implementar un minicontrolador desde cero en la app emisora.

En CAF, el SDK proporciona una vista personalizada, MiniControllerFragment: que puedes agregar al archivo de diseño de la app de las actividades en las que deseas mostrar el minicontrol.

Notificaciones y pantalla de bloqueo

En la v2, el SDK no proporciona controladores para las notificaciones y la pantalla de bloqueo. Para ese SDK, debes compilar estas funciones en tu app emisora usando el APIs del framework de Android.

En CAF, el SDK proporciona un NotificationsOptions.Builder para ayudarte a crear controles multimedia para las notificaciones y la pantalla de bloqueo en la app emisora. Se pueden habilitar los controles de notificación y de pantalla de bloqueo con el CastOptions cuando inicializas 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();
}

Control expandido

En la v2, debes implementar un control expandido desde cero en la app emisora.

El CAF proporciona un UIMediaController que facilita la creación de tu propia clase de responsable del tratamiento de datos.

CAF agrega un widget de controlador expandido previamente compilado ExpandedControllerActivity que puedes agregar a tu app fácilmente. Ya no es necesario implementar un control expandido personalizado con UIMediaController.

Enfoque de audio

En la versión 2, debes usar MediaSessionCompat para administrar el foco de audio.

En CAF, el foco de audio se administra automáticamente.

Registro de depuración

En CAF, no hay opciones de registro.

Apps de ejemplo

Tenemos instructivos de codelabs y apps de ejemplo que usan CAF.