背景:
方法setDataSource(Context context, Uri uri, Map<String, String> headers)已经包含在SDK中很长一段时间了(标记为@hide)(至少自Froyo 2.2.x,API Level 8以来),请查看更改历史记录:
API 扩展:支持在指定要播放的媒体数据的 uri 时选择性地指定额外请求标头的映射
自Ice Cream Sandwich 4.0.x,API级别14以来,一直不隐藏并向公众开放:
取消隐藏 MediaPlayer 的 setDataSource 方法,该方法采用要传递给服务器的可选 http 标头
解决方法:
在 Ice Cream Sandwich 4.0.x API 级别 14 之前,我们可以使用反射调用此隐藏 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();
... ...