Samsung Galaxy S4(SGS4)上的Android套接字问题

时间:2013-05-13 14:05:27

标签: android proxy android-mediaplayer samsung-mobile

我们最近收到有关三星Galaxy S4上我们的Android应用中没有播放音频的报道。该应用程序适用于其他设备。

使用MediaPlayer流式传输音频。它使用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.

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

任何解决方案都会被大大接受。

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

2 个答案:

答案 0 :(得分:4)

我终于找到导致此问题的问题。正如所料,媒体播放器正在尝试范围请求以尝试查找id3信息。在其他手机上,只需将标题状态行设置为HTTP/1.0 206 OK即可阻止媒体播放器执行此类范围请求。然而,由于一些奇怪的原因,这在S4上是不正确的(感谢三星!)。

因此,为了解决这个问题,您只需要处理这些范围请求。在我的情况下,我只打了一次socket.accept()。我将此更改为在isRunning函数中run()为真时循环执行。这样,当新请求完成时,就可以正确处理。我的代码的简化版本看起来像这样......

public void run() {

    while (isRunning) {

        client = socket.accept();

        HttpResponse cloudResponse = startCloudRequest();
        sendDataToMediaPlayer(cloudResponse);

    }
}

希望这有帮助。

答案 1 :(得分:0)

当另一侧已关闭您的连接时,通常会发生断管。确保正确代理标题,然后在投入正文之前插入两个换行符。你正在喂另一端的东西可能会促使套接字关闭......这只发生在S4上?你发送内容长度吗?