Samsung Galaxy S4(SGS4)上的Android Socket问题

我们最近已经收到三星Galaxy S4在我们的Android应用程序中播放audio的报道。 该应用程序在其他设备上很好。

audio使用MediaPlayer进行stream式传输。 它使用Android Socket方法保存在本地。

Logcat中的警告是由以下原因造成的:

try { byte[] buffer = httpString.toString().getBytes(); int readBytes = -1; Log.d(LOG_TAG, "writing to client"); client.getOutputStream().write(buffer, 0, buffer.length); // Start streaming content. byte[] buff = new byte[1024 * 64]; while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { client.getOutputStream().write(buff, 0, readBytes); } } 

堆栈跟踪如下:

 D/StreamProxy(3913): downloaded D/StreamProxy(3913): downloading... D/StreamProxy(3913): reading headers D/StreamProxy(3913): headers done HTTP/1.0 200 OK D/StreamProxy(3913): Content-Type: audio/mpeg D/StreamProxy(3913): D/StreamProxy(3913): writing to client W/StreamProxy(3913): Broken pipe. W/StreamProxy(3913): java.net.SocketException: sendto failed: EPIPE (Broken pipe) W/StreamProxy(3913): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506) W/StreamProxy(3913): at libcore.io.IoBridge.sendto(IoBridge.java:475) W/StreamProxy(3913): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507) W/StreamProxy(3913): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) W/StreamProxy(3913): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269) W/StreamProxy(3913): at com.gm.mobile.util.StreamProxy.processRequest(StreamProxy.java:234) W/StreamProxy(3913): at com.gm.mobile.util.StreamProxy.run(StreamProxy.java:123) W/StreamProxy(3913): at java.lang.Thread.run(Thread.java:856) W/StreamProxy(3913): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe) W/StreamProxy(3913): at libcore.io.Posix.sendtoBytes(Native Method) W/StreamProxy(3913): at libcore.io.Posix.sendto(Posix.java:151) W/StreamProxy(3913): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) W/StreamProxy(3913): at libcore.io.IoBridge.sendto(IoBridge.java:473) W/StreamProxy(3913): ... 6 more E/(3913): client closing D/StreamProxy(3913): Proxy interrupted. Shutting down. 

当我注释掉代理代码时,stream播放,但是,它开始播放一秒钟,然后开始缓冲2-3秒,然后恢复。

任何解决scheme将被大大接受。

我发现了类似的问题,但还没有解决:

  • Android:Socket – java.net.SocketException:sendto失败:EPIPE(Broken pipe)
  • Samsung Grand的媒体播放器套接字exception

Solutions Collecting From Web of "Samsung Galaxy S4(SGS4)上的Android Socket问题"

我终于想出了这个问题。 正如所料,媒体播放器正在做范围请求,试图findid3的信息。 在其他电话上,只需将标题状态行设置为HTTP/1.0 206 OK防止媒体播放器执行此类范围请求。 然而,由于一些奇怪的原因,这是不正确的S4(谢谢三星!)。

所以为了解决这个问题,你只需要处理这些范围的请求。 在我的情况下,我只是一次调用socket.accept() 。 我改变了这个循环,而isRunning在我的run()函数中是true。 这样,当一个新的请求完成时,它被正确处理。 我的代码的一个切碎的版本看起来像这样…

 public void run() { while (isRunning) { client = socket.accept(); HttpResponse cloudResponse = startCloudRequest(); sendDataToMediaPlayer(cloudResponse); } } 

希望这可以帮助。

当另一侧closures了你的连接时,通常会发生断pipe。 确保你正确代理标题,然后在投入正文之前放入两条新行。 你正在喂另一端的东西可能会提示套接字closures….这只发生在S4? 你发送内容的长度?