【问题标题】:How do I include http headers with MediaPlayer setDataSource?如何在 MediaPlayer setDataSource 中包含 http 标头?
【发布时间】:2012-01-22 05:51:21
【问题描述】:

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

我的代码如下:

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

【问题讨论】:

    标签: java android media-player android-mediaplayer


    【解决方案1】:

    背景:

    方法 setDataSource(Context context, Uri uri, Map<String, String> headers) 已包含在 SDK 中(标记为 @hide)很长时间(至少从 Froyo 2.2.x,API 级别 8 开始),请查看更改历史记录:

    API Extension: Support for optionally specifying a map of extra request headers when specifying the uri of media data to be played

    自 Ice Cream Sandwich 4.0.x API 级别 14 以来一直未隐藏并向公众开放:

    Unhide MediaPlayer's setDataSource method that takes optional http headers to be passed to the server

    解决方法:

    在 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.x 之前的 Android 版本,我只使用 url 传递查询参数。
    • 你救了我这么晚,我花了几个月的时间才找到解决办法,还是谢谢你
    • 发送请求后有什么办法可以看到setDataSource()生成的请求url?
    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多