android 6.0 以下的 MediaPlayer 居然不能携带 http headers Referer

本文探讨了在Android 6.0及以下版本中,MediaPlayer在播放HTTP流媒体时无法携带Referer头部的问题。测试代码显示,此现象可能对某些应用场景产生影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!

今天测试 android MediaPlayer,发现居然发出的 http 请求不能携带 Referer,测试代码如下:

        Uri uri = Uri.parse("http://100.84.44.221:8001/12418.mp4");

        HashMap<String, String> headers = new HashMap<String, String>();

        headers.put("Referer", "http://100.84.44.221:8001/play13967.html");
        headers.put("User-Agent", "User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-CN; GT-N7100 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.2.0.880 Mobile Safari/537.36");

        try {
            mediaPlayer.setDataSource(surfaceView.getContext(), uri, headers);
            if (mPendingPlay)
                mediaPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
在 http 服务器这边,发现发过来的 http request headers 有 User-Agent 没有 Referer,用 4.1,4.4 手机测试都没有,用 6.0 的手机测试有。翻 android 源码,果然是系统搞的,源码如下:

// android 4.1.2
// /external/chromium/net/http/http_network_transaction.cc
void HttpNetworkTransaction::BuildRequestHeaders(bool using_proxy) {
  // ...
  static const char* const kExtraHeadersToBeStripped[] = {
    "Referer"
  };
  HttpRequestHeaders stripped_extra_headers;
  stripped_extra_headers.CopyFrom(request_->extra_headers);
  for (size_t i = 0; i < arraysize(kExtraHeadersToBeStripped); ++i)
    stripped_extra_headers.RemoveHeader(kExtraHeadersToBeStripped[i]);

// android 4.4.x 5.x
// /external/chromium_org/net/url_request/url_request_http_job.cc
void URLRequestHttpJob::Start() {
  // ...
  request_info_.extra_headers.RemoveHeader(HttpRequestHeaders::kReferer);

翻 android 6.0 的源码就没有这个逻辑,坑爹啊。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值