Estoy pasando un URI al método setDataSource del objeto MediaPlayer. Estoy apuntando a una versión de API menor a 14, así que creo que no puedo usar el nuevo método que permite incluir encabezados. ¿Cómo puedo incluir encabezados (específicamente, encabezado de autenticación) con la solicitud de MediaPlayer y seguir admitiendo dispositivos Android más antiguos?

Mi código se ve como:

 mediaPlayer.setDataSource(url);
 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 mediaPlayer.prepareAsync();
16
Jim Geurts 22 ene. 2012 a las 09:51

1 respuesta

La mejor respuesta

Fondo:

El método setDataSource (Context context, Uri uri, Map headers) se ha incluido en el SDK (marcado como @hide) durante bastante tiempo (al menos desde Froyo 2.2.x, API nivel 8), consulte el historial de cambios:

Extensión de API: soporte para especificar opcionalmente un mapa de encabezados de solicitud adicionales al especificar el uri de los datos multimedia que se reproducirán

Y no se ha ocultado y está abierto al público desde Ice Cream Sandwich 4.0.x, API nivel 14:

Mostrar el método setDataSource de MediaPlayer que toma encabezados http opcionales para pasar al servidor

Solución alterna:

Antes de Ice Cream Sandwich 4.0.x, API nivel 14, podemos usar la llamada de reflexión a esta API oculta:

Uri uri = Uri.parse(path);
Map<String, String> headers = new HashMap<String, String>();
headers.put("key1", "value1");
headers.put("key2", "value2");
        
mMediaPlayer = new MediaPlayer();
// Use java reflection call the hide API:
Method method = mMediaPlayer.getClass().getMethod("setDataSource", new Class[] { Context.class, Uri.class, Map.class });
method.invoke(mMediaPlayer, new Object[] {this, uri, headers});
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepareAsync();

... ...
17
Community 20 jun. 2020 a las 12:12
Para las versiones anteriores a 2.x de Android, recurrí a simplemente pasar parámetros de consulta con la URL.
 – 
Jim Geurts
16 ago. 2012 a las 03:20
Me salvas la vida tan tarde, pasé unos meses para encontrar una solución, de todos modos gracias
 – 
vuhung3990
2 dic. 2014 a las 13:24
¿Hay alguna forma de ver la URL de solicitud generada por setDataSource () después de que se envía una solicitud?
 – 
user1841702
8 abr. 2016 a las 13:42