如何在 MediaPlayer setDataSource 中包含 http 标头?

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

我的代码看起来像这样:

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

答案 1

背景:

方法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();

... ...

答案 2

推荐