Android 4.4的HTTP API存在漏洞吗?

12

我决定开始使用Android 4.4测试我的应用程序,并注意到Android HTTP连接API比以前严格得多?我以前从未遇到过这个问题,我认为它是某种类型的错误。

我正在连接包含特定icy头响应的SHOUTcast广播。

有人遇到过这个问题吗?我该如何解决?

用于此测试的URL:

http://50.117.121.162:80

异常的Logcat:

11-01 23:47:57.299: E/ConnectHelper(3081): java.net.ProtocolException: Unexpected status line: ICY 200 OK 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.RawHeaders.setStatusLine(RawHeaders.java:108) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:308) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.vblast.xiialive.media.streamers.ConnectHelper.connectWorker(ConnectHelper.java:176) 11-01 23:47:57.299: E/ConnectHelper(3081): at com.vblast.xiialive.media.streamers.ConnectHelper.run(ConnectHelper.java:143) 11-01 23:47:57.299: E/ConnectHelper(3081): at java.lang.Thread.run(Thread.java:841)


注意那里的 okhttp。据我所知,Kitkat中已经用Square的OkHTTP替换了HttpURLConnection实现。 - laalto
是的,我觉得底层一定有什么变化。这太烦人了。我真的需要找到一个解决办法。有什么建议吗? - Jona
3个回答

6
在Android 4.4中,底层发生了变化,不再支持非标准的SHOUTcast ICY头响应。就像Apache HTTPClient库一样。
我所做的可以在这篇文章中找到:
如何解析非标准的HTTP响应?

我还添加了使用Apache HttpClient解决此问题的解决方案。希望这可以帮到你。 - Michał M

0

我已经实现了一个基于Apache HttpClient的解决方案,你可以在此处找到它的gist片段

以下是如何使用它:

IcyGetRequest request = new IcyGetRequest(urlStr);
HttpResponse response = request.get();
int responseCode = response.getStatusLine().getStatusCode();

0

1
请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接保留为参考。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接