gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:56:34 26 4
gpt4 key购买 nike

我们最近收到报告称,我们的 Android 应用程序无法在 Samsung Galaxy S4 上播放音频。该应用在其他设备上运行良好。

音频是使用 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 秒,然后再继续。

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

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

最佳答案

我终于弄清楚了导致此问题的原因。正如预期的那样,媒体播放器正在执行范围请求以尝试查找 id3 信息。在其他手机上,只需将 header 状态行设置为 HTTP/1.0 206 OK 即可阻止媒体播放器执行此类范围请求。然而,出于某种奇怪的原因,这在 S4 上并非如此(感谢三星!)。

因此,为了修复它,您只需要处理这些范围请求。在我的例子中,我只调用了一次 socket.accept()。当 isRunning 在我的 run() 函数中为真时,我将其更改为在循环中执行。这样,当一个新请求完成时,它会被正确处理。我的代码的精简版如下所示...

public void run() {

while (isRunning) {

client = socket.accept();

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

}
}

希望这对您有所帮助。

关于Samsung Galaxy S4 (SGS4) 上的 Android 套接字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com