Desarrolladores     Centro de desarrolladores

Centro de desarrolladores

under hero banner

Tutorial de la aplicación de Android (usando BB Token)

Este tutorial lo guía a través del proceso de transmisión de contenido cifrado en un dispositivo Android y la creación de una aplicación multimedia básica habilitada para Android ExpressPlay para reproducir el contenido utilizando un token Marlin BB.

Equipo recomendado:

  • Un dispositivo que funcione con Android 4.0.X o superior

PASO 1: instale el SDK de Android

Descargue el SDK de Android; la última versión se puede encontrar aquí: http://developer.android.com/sdk/index.html


PASO 2: descargue el último SDK de ExpressPlay

La última copia del SDK de ExpressPlay se puede descargar desde Portal de administración de ExpressPlay.

Asegúrese de recordar dónde guardó su archivo.


PASO 3: Importe el proyecto ExpressPlayExampleBB desde el SDK de ExpressPlay

Por favor refiérase a http://www.expressplay.com/developer/tutorial-android-app para importar el proyecto a Android Studio o Eclipse.


Las importaciones son esencialmente las mismas que para el tutorial básico:


importar java.io.ByteArrayOutputStream;
importar java.io.IOException;
importar java.io.InputStream;

importar android.app.Activity;
importar android.app.Fragment;
importar android.net.Uri;
importar android.os.Bundle;
importar android.util.Log;
importar android.view.LayoutInflater;
importar android.view.Menu;
importar android.view.MenuItem;
importar android.view.View;
importar android.view.ViewGroup;
importar android.widget.MediaController;
importar android.widget.VideoView;

importar com.intertrust.wasabi.ErrorCodeException;
importar com.intertrust.wasabi.Runtime;
importar com.intertrust.wasabi.media.PlaylistProxy;
importar com.intertrust.wasabi.media.PlaylistProxy.MediaSourceParams;
importar com.intertrust.wasabi.media.PlaylistProxy.MediaSourceType;



La clase Actividad define algunas constantes/enumeraciones y el fragmento que implementa la personalización, la adquisición del token de licencia de banda ancha de Marlin y transmite el video a través del VídeoVer.


/*
* esta enumeración simplemente asigna los tipos de medios a los tipos MIME necesarios para el proxy de la lista de reproducción
*/
enumerar tipos de contenido {
DASH("aplicación/dash+xml"), HLS("aplicación/vnd.apple.mpegurl"), PDCF(
"vídeo/mp4"), M4F("vídeo/mp4"), DCF("aplicación/vnd.oma.drm.dcf"), BBTS(
"vídeo/mp2t");
Cadena mediaSourceParamsContentType = nulo;

Tipos de contenido privados (String mediaSourceParamsContentType) {
this.mediaSourceParamsContentType = mediaSourceParamsContentType;
}

cadena pública getMediaSourceParamsContentType() {
devolver mediaSourceParamsContentType;
}
}

clase pública MarlinBroadbandExample extiende Actividad {

@Anular
vacío protegido onCreate (paquete saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marlin_broadband_example);

si (savedInstanceState == nulo) {
getFragmentManager().beginTransaction()
.add(R.id.container, new MBB_Playback_Fragment()).commit();
}
}

@Anular
público booleano onCreateOptionsMenu (menú menú) {

// Inflar el menú; esto agrega elementos a la barra de acciones si está presente.
getMenuInflater().inflate(R.menu.marlin_broadband_example, menú);
devolver verdadero;
}

@Anular
onOptionsItemSelected público booleano (elemento de elemento de menú) {
// Maneja los clics en elementos de la barra de acciones aquí. La barra de acción
// maneja automáticamente los clics en el botón Inicio/Arriba, siempre y cuando
// cuando especificas una actividad principal en AndroidManifest.xml.
int id = elemento.getItemId();
si (id == R.id.action_settings) {
devolver verdadero;
}
devolver super.onOptionsItemSelected(elemento);
}

/**
* Un fragmento de marcador de posición que contiene una vista simple.
*/
clase estática pública MBB_Playback_Fragment extiende Fragmento {

Lista de reproducción privadaProxy playerProxy;
TAG de cadena final estática = "SampleBBPlayer";

público MBB_Playback_Fragment() {
}

@Anular
Vista pública onCreateView (inflador LayoutInflater, contenedor ViewGroup,
Paquete saveInstanceState) {
Ver rootView = inflar.inflar(
R.layout.fragment_marlin_broadband_example, contenedor,
FALSO);

/*
* Crea un VideoView para reproducir
*/
VideoView videoView = (VideoView) raízView
.findViewById(R.id.videoView);
MediaController mediaController = nuevo MediaController(
getActividad(), falso);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);

intentar {
/*
* Inicializar Wasabi Runtime (necesario solo una vez por cada
* creación de instancias de la aplicación)
*
* ** Nota: Configure las propiedades de tiempo de ejecución según sea necesario para su
* ambiente
*/
Runtime.initialize(getActivity().getDir("wasabi", MODE_PRIVATE)
.getAbsolutePath());
/*
* Personalizar la aplicación (adquirir claves DRM). Esto es sólo
* necesario una vez cada vez que la aplicación se instala recientemente
*
* ** Nota: personalizar() es una llamada de bloqueo y puede tardar mucho tiempo
* suficiente para completar y activar ANR (Aplicación no
*Respuesta) errores. En una aplicación de producción esto debería
* ser llamado en un hilo de fondo.
*/
si (!Runtime.isPersonalized())
Tiempo de ejecución.personalizar();

} captura (NullPointerException e) {
devolver vista raíz;
} captura (ErrorCodeException e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de inicialización o personalización del tiempo de ejecución: "
+ e.getLocalizedMessage());
devolver vista raíz;
}

/*
* Adquirir una Licencia de Banda Ancha Marlin. La licencia se adquiere utilizando
* un token de adquisición de licencia. Estos tokens para contenido de muestra pueden
* obtenerse de http://content.intertrust.com/express/ y en
* este ejemplo se almacena en el directorio /assets del proyecto de Android
* usando el nombre de archivo "license-token.xml".
*
* Por ejemplo, puedes descargar dicho token desde
* http://content-access.intertrust-dev.com/EXPR005/bb y guárdelo
* al directorio de activos como License-token.xml"
*
* *** Nota: ProcessServiceToken() es una llamada de bloqueo y puede tomar
* tiempo suficiente para completarse y activar ANR (Aplicación no
*Respuesta) errores. En una aplicación de producción esto debería ser
* llamado en un hilo de fondo.
*/

Cadena LicenseAcquisitionToken = getActionTokenFromAssets(LICENSE_TOKEN_FILENAME);
if (licenseAcquisitionToken == nulo) {
Log.e(ETIQUETA,
"No se pudo encontrar el token de acción en el directorio de activos - saliendo");
devolver vista raíz;
}
inicio largo = System.currentTimeMillis();
intentar {
Runtime.processServiceToken(licenseAcquisitionToken);
Log.i(TAG,
"Licencia adquirida exitosamente en (ms):"
+ (System.currentTimeMillis() - inicio));
} captura (ErrorCodeException e1) {
Log.e(ETIQUETA,
"No se pudo adquirir la licencia desde el token de adquisición de licencia - saliendo");
devolver vista raíz;
}

/*
* crear un proxy de lista de reproducción e iniciarlo
*/
intentar {
playerProxy = nuevo PlaylistProxy();
jugadorProxy.start();
} captura (ErrorCodeException e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de proxy de lista de reproducción: " + e.getLocalizedMessage());
devolver vista raíz;
}

/*
* Adquiera una URL de transmisión de medios cifrada con la clave entregada en
* la licencia anterior. Las URL de Media Stream se pueden obtener en
* http://content.intertrust.com/express/.
*
* Por ejemplo, un flujo de contenido DASH protegido con la licencia
* el ejemplo de token anterior es
* "http://content.intertrust.com/express/dash/mpd.xml"
*
* Tenga en cuenta que MediaSourceType debe adaptarse al tipo de transmisión
* (DASH o HLS). Similarmente,
* los MediaSourceParams deben configurarse según el tipo de medio
* si MediaSourceType es SINGLE_FILE
*/

Cadena dash_url = DASH_MPD_URL;
ContentTypes contentType = ContentTypes.FIXTHIS;

MediaSourceParams parámetros = nuevos MediaSourceParams();
params.sourceContentType = tipo de contenido
.getMediaSourceParamsContentType();

/*
* si el contenido tiene pistas de audio separadas (por ejemplo, idiomas), puede
* seleccione uno usando MediaSourceParams, por ejemplo params.language="es";
*/

/*
* Cree una URL de PlaylistProxy y pásela a VideView y comience
* reproducción
*/
Cadena proxy_url = nulo;
intentar {
proxy_url = playerProxy.makeUrl(dash_url, MediaSourceType.DASH,
parámetros);
videoView.setVideoURI(Uri.parse(proxy_url));
videoView.start();

} captura (Excepción e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de reproducción: " + e.getLocalizedMessage());
e.printStackTrace();
devolver vista raíz;
}

devolver vista raíz;

}

/**************************************
* Métodos de ayuda para evitar el desorden *
**************************************/

/*
* Leer un archivo de token de acción del directorio de activos
*/
Cadena protegida getActionTokenFromAssets (String tokenFileName) {
Token de cadena = nulo;
byte[] readBuffer = nuevo byte[1024];
ByteArrayOutputStream baos = nuevo ByteArrayOutputStream();
InputStream es = nulo;
int bytesLeer = 0;

intentar {
es = getActivity().getAssets()
.open(tokenFileName, MODE_PRIVATE);
mientras ((bytesRead = is.read(readBuffer)) != -1) {
baos.write(readBuffer, 0, bytesRead);
}
baos.cerrar();
está cerca();
} captura (IOException e) {
e.printStackTrace();
devolver nulo;
}
token = new String(baos.toByteArray());
ficha de devolución;
}

}

}

Ahora echemos un vistazo a lo que hace el código.

El método onCreateView del fragmento MBB_Playback_Fragment comienza estableciendo el contenido en el archivo xml creado con el VídeoVer dentro de eso.


Ver rootView = inflar.inflar(
R.layout.fragment_marlin_broadband_example, contenedor,
FALSO);

A continuación, el VídeoVer está arreglado.


/*
* Crea un VideoView para reproducir
*/
VideoView videoView = (VideoView) raízView
.findViewById(R.id.videoView);
MediaController mediaController = nuevo MediaController(
getActividad(), falso);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);

Luego, personalización.


intentar {
/*
* Inicializar Wasabi Runtime (necesario solo una vez por cada
* creación de instancias de la aplicación)
*
* ** Nota: Configure las propiedades de tiempo de ejecución según sea necesario para su
* ambiente
*/
Runtime.initialize(getActivity().getDir("wasabi", MODE_PRIVATE)
.getAbsolutePath());
/*
* Personalizar la aplicación (adquirir claves DRM). Esto es sólo
* necesario una vez cada vez que la aplicación se instala recientemente
*
* ** Nota: personalizar() es una llamada de bloqueo y puede tardar mucho tiempo
* suficiente para completar y activar ANR (Aplicación no
*Respuesta) errores. En una aplicación de producción esto debería
* ser llamado en un hilo de fondo.
*/
si (!Runtime.isPersonalized())
Tiempo de ejecución.personalizar();

} captura (NullPointerException e) {
devolver vista raíz;
} captura (ErrorCodeException e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de inicialización o personalización del tiempo de ejecución: "
+ e.getLocalizedMessage());
devolver vista raíz;
}

Luego, se adquiere la Licencia Marlin Broadband. Siguiendo los comentarios en el código, obtenga un token de adquisición de licencia haciendo clic aquí
y guardar el archivo en “license-token.xml”. Guarde este archivo en la carpeta de activos de su proyecto de aplicación de Android.
Nota: Después de un tiempo, esta licencia caducará. Pero se puede adquirir uno nuevo siguiendo el mismo proceso.


/*
* Adquirir una Licencia de Banda Ancha Marlin. La licencia se adquiere utilizando
* un token de adquisición de licencia. Estos tokens para contenido de muestra pueden
* obtenerse de http://content.intertrust.com/express/ y en
* este ejemplo se almacena en el directorio /assets del proyecto de Android
* usando el nombre de archivo "license-token.xml".
*
* Por ejemplo, puedes descargar dicho token desde
* http://content-access.intertrust-dev.com/EXPR005/bb y guárdelo
* al directorio de activos como License-token.xml"
*
* *** Nota: ProcessServiceToken() es una llamada de bloqueo y puede tomar
* tiempo suficiente para completarse y activar ANR (Aplicación no
*Respuesta) errores. En una aplicación de producción esto debería ser
* llamado en un hilo de fondo.
*/

Cadena LicenseAcquisitionToken = getActionTokenFromAssets(LICENSE_TOKEN_FILENAME);
if (licenseAcquisitionToken == nulo) {
Log.e(ETIQUETA,
"No se pudo encontrar el token de acción en el directorio de activos - saliendo");
devolver vista raíz;
}
inicio largo = System.currentTimeMillis();
intentar {
Runtime.processServiceToken(licenseAcquisitionToken);
Log.i(TAG,
"Licencia adquirida exitosamente en (ms):"
+ (System.currentTimeMillis() - inicio));
} captura (ErrorCodeException e1) {
Log.e(ETIQUETA,
"No se pudo adquirir la licencia desde el token de adquisición de licencia - saliendo");
devolver vista raíz;
}

Luego, obtenga la URL de la transmisión de medios. Esta URL está cifrada con la clave que se encuentra en el token de licencia anterior.


/*
* Adquirir una Licencia de Banda Ancha Marlin. La licencia se adquiere utilizando
* un token de adquisición de licencia. Estos tokens para contenido de muestra pueden
* obtenerse de http://content.intertrust.com/express/ y en
* este ejemplo se almacena en el directorio /assets del proyecto de Android
* usando el nombre de archivo "license-token.xml".
*
* Por ejemplo, puedes descargar dicho token desde
* http://content-access.intertrust-dev.com/EXPR005/bb y guárdelo
* al directorio de activos como License-token.xml"
*
* *** Nota: ProcessServiceToken() es una llamada de bloqueo y puede tomar
* tiempo suficiente para completarse y activar ANR (Aplicación no
*Respuesta) errores. En una aplicación de producción esto debería ser
* llamado en un hilo de fondo.
*/

Cadena LicenseAcquisitionToken = getActionTokenFromAssets(LICENSE_TOKEN_FILENAME);
if (licenseAcquisitionToken == nulo) {
Log.e(ETIQUETA,
"No se pudo encontrar el token de acción en el directorio de activos - saliendo");
devolver vista raíz;
}
inicio largo = System.currentTimeMillis();
intentar {
Runtime.processServiceToken(licenseAcquisitionToken);
Log.i(TAG,
"Licencia adquirida exitosamente en (ms):"
+ (System.currentTimeMillis() - inicio));
} captura (ErrorCodeException e1) {
Log.e(ETIQUETA,
"No se pudo adquirir la licencia desde el token de adquisición de licencia - saliendo");
devolver vista raíz;
}

Luego, cree PlaylistProxy e inícielo. Adquiera el flujo de medios protegido correspondiente a la licencia, cree una URL de PlaylistProxy a partir de esa URL de medios y establezca la VídeoVer para reproducir desde la URL de PlaylistProxy.


/*
* crear un proxy de lista de reproducción e iniciarlo
*/
intentar {
playerProxy = nuevo PlaylistProxy();
jugadorProxy.start();
} captura (ErrorCodeException e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de proxy de lista de reproducción: " + e.getLocalizedMessage());
devolver vista raíz;
}
/*
* Adquiera una URL de transmisión de medios cifrada con la clave entregada en
* la licencia anterior. Las URL de Media Stream se pueden obtener en
* http://content.intertrust.com/express/.
*
* Por ejemplo, un flujo de contenido DASH protegido con la licencia
* el ejemplo de token anterior es
* "http://content.intertrust.com/express/dash/mpd.xml"
*
* Tenga en cuenta que MediaSourceType debe adaptarse al tipo de transmisión
* (DASH o HLS). Similarmente,
* los MediaSourceParams deben configurarse según el tipo de medio
* si MediaSourceType es SINGLE_FILE
*/

Cadena dash_url = DASH_MPD_URL;
ContentTypes contentType = ContentTypes.FIXTHIS;

MediaSourceParams parámetros = nuevos MediaSourceParams();
params.sourceContentType = tipo de contenido
.getMediaSourceParamsContentType();

/*
* si el contenido tiene pistas de audio separadas (por ejemplo, idiomas), puede
* seleccione uno usando MediaSourceParams, por ejemplo params.language="es";
*/

/*
* Cree una URL de PlaylistProxy y pásela a VideView y comience
* reproducción
*/
Cadena proxy_url = nulo;
intentar {
proxy_url = playerProxy.makeUrl(dash_url, MediaSourceType.DASH,
parámetros);
videoView.setVideoURI(Uri.parse(proxy_url));
videoView.start();

} captura (Excepción e) {
// Consulta WasabiErrors.txt para resolución de los códigos de error
Log.e(TAG, "error de reproducción: " + e.getLocalizedMessage());
e.printStackTrace();
devolver vista raíz;
}

El siguiente método adquiere el token del archivo License-token.xml ubicado en la carpeta de activos.


/**************************************
* Métodos de ayuda para evitar el desorden *
**************************************/

/*
* Leer un archivo de token de acción del directorio de activos
*/
Cadena protegida getActionTokenFromAssets (String tokenFileName) {
Token de cadena = nulo;
byte[] readBuffer = nuevo byte[1024];
ByteArrayOutputStream baos = nuevo ByteArrayOutputStream();
InputStream es = nulo;
int bytesLeer = 0;

intentar {
es = getActivity().getAssets()
.open(tokenFileName, MODE_PRIVATE);
mientras ((bytesRead = is.read(readBuffer)) != -1) {
baos.write(readBuffer, 0, bytesRead);
}
baos.cerrar();
está cerca();
} captura (IOException e) {
e.printStackTrace();
devolver nulo;
}
token = new String(baos.toByteArray());
ficha de devolución;
}



PASO 4 – Permiso

Vaya al explorador de paquetes y abra 'AndroidManifest.xml'. Vaya al código xml real.

Para otorgar permiso de Internet al SDK de ExpressPlay, así como permiso para escribir en el almacenamiento externo del dispositivo Android, agregue el siguiente bloque de código en el medio. android:targetSdkVersion="17"/> y <application como se muestra en la imagen de arriba.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

Ahora el código está listo para ejecutarse.

Nota: Si está utilizando una máquina virtual Android, en lugar de un dispositivo real, es posible que el vídeo no funcione, pero el audio sí.