Comment inclure les en-têtes http avec MediaPlayer setDataSource?

Je passe un URI à la méthode setDataSource de l’object MediaPlayer . Je vise la version api inférieure à 14, donc je ne peux pas utiliser la nouvelle méthode qui permet d’inclure les en-têtes. Comment puis-je inclure des en-têtes (en particulier, en-tête d’authentification) avec la requête MediaPlayer et toujours prendre en charge les anciens appareils Android?

Mon code ressemble à:

mediaPlayer.setDataSource(url); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.prepareAsync(); 

Contexte:

La méthode setDataSource (en-têtes de contexte, Uri uri, Map ) a été incluse dans le SDK (marquée comme @hide) pendant assez longtemps (au moins depuis Froyo 2.2.x, API niveau 8), cochez sur l’historique du changement:

Extension de l’API: Prise en charge de la spécification facultative d’une mappe d’en-têtes de requête supplémentaires lors de la spécification de l’URI des données multimédia à lire.

Et a été caché et ouvert au public depuis Ice Cream Sandwich 4.0.x, API Niveau 14:

Afficher la méthode setDataSource de MediaPlayer qui prend les en-têtes http facultatifs à transmettre au serveur

Solution de contournement:

Avant Ice Cream Sandwich 4.0.x, API Level 14, nous pouvons utiliser l’appel de reflection de cette API hide:

 Uri uri = Uri.parse(path); Map headers = new HashMap(); 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(); ... ...