首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三星Galaxy S4 (SGS4)上的安卓套接字问题

三星Galaxy S4 (SGS4)上的安卓套接字问题
EN

Stack Overflow用户
提问于 2013-05-13 14:05:26
回答 2查看 2.9K关注 0票数 8

最近,我们收到了关于三星Galaxy S4上的安卓应用程序没有播放音频的报道。这个应用程序在其他设备上也很好。

音频使用MediaPlayer进行流。它使用Android套接字方法在本地保存。

Logcat中的警告是由以下原因引起的:

代码语言:javascript
复制
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);
    }
}

堆栈跟踪如下:

代码语言:javascript
复制
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秒,然后再继续。

任何解决办法都将得到很大的接受。

我发现了类似的问题,但这些问题没有得到解决:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 01:26:18

我终于找到了导致这件事的原因。正如预期的那样,媒体播放器正在执行范围请求,试图查找id3信息。在其他手机上,简单地将标题状态行设置为HTTP/1.0 206 OK将阻止媒体播放器执行这样的范围请求。然而,出于一些奇怪的原因,S4上的情况并非如此(谢谢三星!)

因此,为了修复它,您只需要处理这些范围请求。在我的例子中,我只打了一次电话给socket.accept()。我将此更改为在循环中执行,而isRunning在我的run()函数中为真。这样,当完成新请求时,就会正确地处理它。我的代码被切成这样.

代码语言:javascript
复制
public void run() {

    while (isRunning) {

        client = socket.accept();

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

    }
}

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2013-05-22 22:21:40

当另一边关闭你的连接时,通常会发生管道断裂。确保您正确地代理了标题,然后在抛入正文之前插入两个换行符。你在给另一端喂食的东西很可能会让插座关闭.这种情况只发生在S4上?您要发送内容长度吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16524051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档