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

Je passe un URI à la méthode setDataSource de l'objet MediaPlayer . Je cible la version api inférieure à 14, alors croyez que je ne peux pas utiliser la nouvelle méthode qui permet d'inclure les en-têtes. Comment puis-je inclure les en-têtes (spécifiquement, l'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(); 

  • Android MediaPlayer Arrêtez et jouez
  • Flux audio Android vers le serveur
  • Android - MediaPlayer's on Prépare Appelé avant même que le flux ne soit préparé sur Android 4.0+
  • Lecteur multimédia Android - Comment désactiver la demande de plage? (Diffusion audio en cours sur Nexus 7)
  • Comment reprendre le mediaplayer?
  • Android: comment configurer le volume MediaPlayer par programme?
  • Comment puis-je lire un mp3 dans le dossier res / raw de mon application Android?
  • Comment obtenir le nom de fichier de l'URI
  • One Solution collect form web for “Comment puis-je inclure les en-têtes http avec MediaPlayer setDataSource?”

    Contexte:

    La méthode setDataSource (Contexte contextuel, Uri uri, Carte <Chaîne, Chaîne> en-têtes) a été incluse dans le SDK (marqué comme @hide) depuis longtemps (au moins depuis Froyo 2.2.x, API Level 8), vérifier L'historique des modifications:

    Extension de l'API: prise en charge pour éventuellement spécifier une carte d'en-têtes de requêtes supplémentaires lors de la spécification de l'uri des données multimédias à jouer

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

    Définissez 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 la réflexion appeler cette API hide:

     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(); ... ... 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.