El siguiente procedimiento te permite convertir tu app emisora para Android del SDK de Cast v2 en el emisor de CAF, que se basa en el singleton CastContext.
El SDK de Cast CAF Sender usa CastContext para administrar GoogleAPIClient en tu nombre. CastContext administra los ciclos de vida, los errores y las devoluciones de llamada por ti, lo que simplifica en gran medida el desarrollo de una app para Cast.
Introducción
- CAF Sender aún se distribuye como parte de los Servicios de Google Play con el Administrador de SDK de Android.
- Se agregaron paquetes nuevos que asumen la responsabilidad de cumplir con la lista de tareas del diseño de Google Cast (
com.google.android.gms.cast.framework.*
). - El emisor de CAF proporciona widgets que cumplen con los requisitos de la UX de Cast. La versión 2 no proporcionó ningún componente de la IU y te exigió que implementaras estos widgets.
- Ya no es necesario usar GoogleApiClient para usar la API de Cast.
- Los subtítulos en el remitente de CAF son similares a la versión 2.
Dependencias
V2 y CAF tienen las mismas dependencias en las bibliotecas de compatibilidad y los Servicios de Google Play (9.2.0 o versiones posteriores), como se describe en la Guía de funciones de la biblioteca de compatibilidad.
La versión mínima del SDK de Android que admite CAF es la 9 (Gingerbread).
Inicialización
En CAF, se requiere un paso de inicialización explícito para el framework de Cast. Esto implica inicializar el singleton CastContext
con un OptionsProvider
adecuado para especificar el ID de la 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 etiqueta "application" del archivo AndroidManifest.xml
de la 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>
Inicializa el CastContext
de manera diferida en el método onCreate
de cada actividad:
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 versión 2.
Cómo detectar dispositivos
En CAF, el framework inicia y detiene automáticamente el proceso de descubrimiento cuando la app pasa a primer plano y a segundo plano, respectivamente. No se deben usar MediaRouteSelector
ni MediaRouter.Callback
.
Botón para transmitir y diálogo de transmisión
Al igual que en la versión 2, la biblioteca de compatibilidad MediaRouter proporciona estos componentes.
El botón para transmitir aún se implementa en MediaRouteButton
y se puede agregar a tu actividad (con ActionBar
o Toolbar
) como un elemento de 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 con CastButtonFactory
para conectar MediaRouteButton
al framework de 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;
}
Cuando alguien presiona el botón, se presenta automáticamente el diálogo de Cast.
Control de dispositivos
En CAF, el framework controla en gran medida el control del dispositivo. La aplicación del remitente no necesita controlar (y no debe intentar controlar) la conexión al dispositivo y el inicio de la aplicación del receptor web con GoogleApiClient
. La interacción entre el remitente y el receptor web ahora se representa como una “sesión”. La clase SessionManager
controla el ciclo de vida de la sesión y la inicia y detiene automáticamente en respuesta a los gestos del usuario: una sesión se inicia cuando el usuario selecciona un dispositivo Cast en el diálogo de Cast y finaliza cuando el usuario presiona el botón "Detener transmisión" en el diálogo de Cast o cuando finaliza la app del remitente. La aplicación del remitente puede recibir notificaciones sobre los eventos del ciclo de vida de la sesión si registra un SessionManagerListener
con SessionManager
. Las devoluciones de llamada de SessionManagerListener
definen métodos de devolución de llamada para todos los eventos del ciclo de vida de la sesión.
La clase CastSession
representa una sesión con un dispositivo Cast. La clase tiene métodos para controlar el volumen y los estados de silenciamiento del dispositivo, lo que antes se hacía en la versión 2 con métodos en Cast.CastApi
.
En la versión 2, las devoluciones de llamada de Cast.Listener
proporcionaban notificaciones de cambios en el estado del dispositivo, incluido el volumen, el estado de silenciamiento, el estado de espera, etcétera.
En CAF, las notificaciones de cambio de estado de volumen o silencio aún se entregan a través de métodos de devolución de llamada en Cast.Listener
. Estos objetos de escucha se registran con CastSession
.
Todas las notificaciones de estado del dispositivo restantes se entregan a través de devoluciones de llamada CastStateListener
. Estos objetos de escucha se registran con CastSession
. Asegúrate de cancelar el registro de los objetos de escucha cuando los fragmentos, las actividades o las apps asociados pasen a segundo plano.
Lógica de reconexión
Al igual que con la versión 2, CAF intenta restablecer las conexiones de red que se pierden debido a la pérdida temporal de la señal de Wi-Fi o a otros errores de red. Esto ahora se hace a nivel de la sesión. Una sesión puede ingresar a un estado “suspendido” cuando se pierde la conexión y volverá a un estado “conectado” cuando se restablezca la conectividad. El framework se encarga de volver a conectarse a la aplicación del receptor web y a cualquier canal de Cast como parte de este proceso.
Además, CAF también agrega la reanudación automática de la sesión, que está habilitada de forma predeterminada (y se puede desactivar a través de CastOptions
).
Si la aplicación del remitente se envía al segundo plano o se finaliza (se desliza o debido a una falla) mientras se está realizando una sesión de Cast, el framework intentará reanudar esa sesión cuando la aplicación del remitente vuelva al primer plano o se reinicie. SessionManager
se encarga de esto automáticamente, y emitirá las devoluciones de llamada adecuadas en cualquier instancia registrada de SessionManagerListener
.
Registro de canales personalizados
En la versión 2, los canales personalizados (implementados con Cast.MessageReceivedCallback
) se registran con Cast.CastApi
. En CAF, los canales personalizados se registran con la instancia CastSession
. El registro se puede realizar en el método de devolución de llamada SessionManagerListener.onSessionStarted
. En el caso de las aplicaciones multimedia, ya no es necesario registrar de forma explícita el canal de control multimedia a través de Cast.CastApi.setMessageReceivedCallbacks
. Para obtener más información, consulta la siguiente sección.
Control multimedia
La clase v2 RemoteMediaPlayer
dejó de estar disponible y no se debe usar. En CAF, se reemplaza por la nueva clase RemoteMediaClient
, que proporciona una funcionalidad equivalente en una API más conveniente. No es necesario inicializar ni registrar este objeto de forma explícita. El framework creará una instancia del objeto automáticamente y registrará el canal multimedia subyacente en el momento de inicio de la sesión si la aplicación del receptor web a la que se conecta admite el espacio de nombres multimedia.
Se puede acceder a RemoteMediaClient
como el método getRemoteMediaClient
del objeto CastSession
.
En la versión 2, todas las solicitudes de contenido multimedia emitidas en RemoteMediaPlayer
mostrarían un RemoteMediaPlayer.MediaChannelResult
a través de una devolución de llamada PendingResult
.
En CAF, todas las solicitudes de contenido multimedia emitidas en RemoteMediaClient
muestran un RemoteMediaClient.MediaChannelResult
a través de una devolución de llamada PendingResult
que se puede usar para hacer un seguimiento del progreso y el resultado final de la solicitud.
El RemoteMediaPlayer
de la versión 2 enviaría notificaciones sobre los cambios en el estado del reproductor multimedia en el receptor web a través de RemoteMediaPlayer.OnStatusUpdatedListener
.
En CAF, RemoteMediaClient
proporciona devoluciones de llamada equivalentes a través de su interfaz RemoteMediaClient.Listener
. Se puede registrar cualquier cantidad de objetos de escucha con RemoteMediaClient
, lo que permite que varios componentes del remitente compartan la única instancia de RemoteMediaClient
asociada con la sesión.
En la versión 2, la aplicación del remitente debía asumir la responsabilidad de mantener la interfaz de 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
La versión 2 no proporciona una IU de superposición introductoria.
CAF proporciona una vista personalizada IntroductoryOverlay
para destacar el botón para transmitir cuando se muestra por primera vez a los usuarios.
Minicontrolador
En la versión 2, debes implementar un minicontrol desde cero en la app del emisor.
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 quieras mostrar el minicontrolador.
Notificaciones y pantalla de bloqueo
En la versión 2, el SDK no proporciona controladores para la notificación y la pantalla de bloqueo. Para ese SDK, debes compilar estas funciones en tu app de remitente con las APIs del framework de Android.
En CAF, el SDK proporciona un NotificationsOptions.Builder
para ayudarte a compilar controles multimedia para las notificaciones y la pantalla de bloqueo en la app del remitente. Los controles de notificación y pantalla de bloqueo se pueden habilitar con CastOptions
cuando se inicializa 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 versión 2, debes implementar un controlador expandido desde cero en la app del remitente.
CAF proporciona una clase auxiliar UIMediaController
que te permite compilar fácilmente tu propio controlador expandido.
CAF agrega un widget de controlador expandido prediseñado
ExpandedControllerActivity
que puedes agregar fácilmente a tu app. Ya no necesitas
implementar un controlador expandido personalizado con UIMediaController
.
Enfoque de audio
En la versión 2, debes usar MediaSessionCompat
para administrar el enfoque 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.