2010-05-28 10 views
14

que he visto bastantes mensajes pidiendo esta pregunta en el SO, pero no parece ser una respuesta definitiva (o, al menos, una respuesta que me gusta!)cómo se debe transmitir contenido autenticado con MediaPlayer en Android

Tengo contenido protegido detrás de la autenticación básica (nombre de usuario/contraseña) - Puedo descargarlo bien usando las diversas clases de descarga HTTP, pero por mi vida no puedo resolver cómo decirle al reproductor multimedia que lo transmita (y proporcione la autenticación). Vi una publicación que sugería que no era posible, ya que el MediaPlayer es todo código nativo y no le gusta el autenticador.

Hay muchos ejemplos de cómo descargar primero a una copia almacenada en la memoria caché y luego reproducirla, pero ... Eso es una mierda (y los archivos tal vez 100 de MB). Vi al menos una propuesta para descargarlo en fragmentos pequeños y luego iniciar & detener la reproducción (redirigir al nuevo archivo) pero ese tipo de mierda también porque habría (supongo) que es un tartamudeo (no lo he intentado aunque)

la mejor idea que tengo en este momento es para iniciar la descarga de un archivo de caché y luego cuando es 'suficientemente completo' puesta en marcha de la reproducción mientras continúo para llenar el archivo .... me esperanza de que esto funciona (pero de nuevo, no lo he probado).

¿Me falta algo obvio? Es muy doloroso tener todas las piezas trabajando y me convencí a mí mismo de que tenía que haber una forma de transmitir de forma nativa el contenido protegido (o hacer que tomara un InputStream calificado ya establecido en &), pero parece no serlo.

BTW Soy un chico de Mac/iPhone y un principiante en Android, así que todavía estoy peleando un poco de aprendizaje de Java ... Disculpe si me falta algo obvio.

+0

desde http://developer.android.com/guide/topics/media/index.html, "Nota: si usted es al pasar una URL a un archivo multimedia en línea, el archivo debe poder descargarse progresivamente ". Si no es así, publica un código. –

+2

hey @loghound ¿Has encontrado una solución? Además de sus consideraciones, estoy pensando en usar algo así como una cookie para almacenar credenciales, y tal vez la función de transmisión de Android lo capte. – sosergio

+1

También descubrí que no puede transmitir HTTPS. Como solución alternativa, implementamos la reproducción progresiva y funciona, pero es una gran cantidad de código. –

Respuesta

2

Si controla el servidor, una opción podría ser modificarlo para que haya una opción para generar una URL temporal aleatoria para el contenido luego de la autenticación, y luego transmitirlo. ¿Aceptarán las funciones de transmisión una URL que incluya parámetros de script?

Para hacer cosas completamente en el teléfono, otra opción sería escribir un proxy http trivial como servidor en Java o código nativo y ejecutarlo en un hilo de fondo. En lugar de apuntar el reproductor multimedia al servidor, apuntarlo a su propio proxy en el dispositivo. El proxy pasará las solicitudes al servidor remoto mientras maneja la autenticación.

1

Un enfoque es descargar los datos usted mismo, decodificarlos (desde ??? a PCM) y usar AudioTrack para reproducir el PCM. El truco está en la decodificación. ¿En qué formato está codificada la transmisión?

Los decodificadores en bruto para protocolos comunes están disponibles en Android, pero en bibliotecas C. Por lo tanto, es posible que deba agregar una capa JNI para realizar su decodificación, de nuevo, dependiendo de en qué codificación esté la secuencia.

0

Tuve el mismo problema, y ​​lo resolví colocando las credenciales en la URL. No es oficialmente compatible con HTTP, pero la mayoría de los clientes web lo admiten.

El código siguiente se basa en este tutorial: http://www.coderzheaven.com/2012/08/14/stream-audio-android/

try { 
     // You can use HTTPS or HTTP as protocol. 
     String myURL = "https://example.com/song.mp3"; 

     mp.reset(); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnPreparedListener(this); 
     mp.setOnErrorListener(this); 

     // These are the two lines, doing the magic ;) It transforms it to a url like this: https://user:[email protected]/song.mp3 
     UsernamePasswordCredentials credentials = connHelper.getCredetials(); 
     myURL = myURL.replace("://", "://" + URLEncoder.encode(credentials.getUserName(), "UTF-8") + ":" + URLEncoder.encode(credentials.getPassword(), "UTF-8") + "@"); 

     mp.setDataSource(myURL); 
     mp.prepareAsync(); 
     mp.setOnCompletionListener(this); 
    } catch (Exception e) { 
     Log.e("StreamAudioDemo", e.getMessage()); 
    } 

NOTA: Al utilizar el URLEncoder aquí, queremos problemas Ungo como: Si el nombre de usuario o contraseña contienen dos puntos o un @.

NOTA2: Es posible que funcione, o no, según el Servidor. Si se encuentra con ese problema, le sugiero que eche un vistazo a ese: Why do browsers not send the Authentication header when the credentials are provided in the URL?

Cuestiones relacionadas