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.