如何在MediaPlayer setDataSource中包含http头文件?

我传递一个URI到MediaPlayer对象的setDataSource方法 。 我的目标是小于14的api版本,所以相信我不能使用允许包含标题的新方法。 如何在MediaPlayer请求中包含头文件(特别是身份validation头文件)并仍支持旧版Android设备?

我的代码如下所示:

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

Solutions Collecting From Web of "如何在MediaPlayer setDataSource中包含http头文件?"

背景:

已经包含在SDK(标记为@hide)相当长时间(至less从Froyo 2.2.x,API Level 8开始)的setDataSource(Context context,Uri uri,Map <String,String> headers)走出变化的历史:

API扩展:指定要播放的媒体数据的URI时,可select指定附加请求标头的地图

自从Ice Cream Sandwich 4.0.x,API Level 14:

取消隐藏MediaPlayer的setDataSource方法,该方法将可选的http头传递给服务器

解决方法:

在Ice Cream Sandwich 4.0.x,API Level 14之前,我们可以使用reflection调用这个hide API:

 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(); ... ...