2013-05-13 23 views
8

Yakın zamanda Samsung Galaxy S4'te Android uygulamalarımızda çalınamayan ses raporları alıyoruz. Uygulama diğer cihazlarda iyidir.Android Socket Sayı (SGS4)

Ses, MediaPlayer kullanılarak akışa aktarılır. Android Socket yöntemini kullanarak yerel olarak kaydedilir.

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); 
    } 
} 

yığın izleme aşağıdaki gibidir:

akışı Proxy kodu açıklama oynatılan
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. 

, ancak çalmaya başlar tarafından

LogCat uyarı kaynaklanır Bir saniye için, devam etmeden önce 2-3 saniye boyunca arabelleğe almaya başlar.

Her türlü çözüm büyük ölçüde kabul edilir.

Ben benzer sorunlar bulduk, ancak çözülmemiştir:

+0

Aynı sorunu yaşıyorum. Henüz bir çözüm yok :( – Nick

+0

En azından ben sadece bir tane değilim. Benim sahip olduğumdan başka var mı? Sorunu çözmenize yardımcı olabilecek bir şey sorunu çözebilir misiniz? – SteveEdson

+0

Ne yazık ki test etmek için bir S4 bile yok. Bunu S4'ün yanı sıra birkaç başka cihazda da gördüm, ancak sorunu tespit edemedim. Eğer bir şey bulursam burayı güncelleyeceğim – Nick

cevap

4

Sonunda buna neden olan sorunu anladım. Beklendiği gibi, medya oynatıcı id3 bilgilerini bulmak amacıyla aralık talepleri yapıyordu. Diğer telefonlarda, başlık durum satırını HTTP/1.0 206 OK'a ayarlamak, medya oynatıcısının bu gibi aralık taleplerini gerçekleştirmesini engelleyecektir. Ancak, bazı garip nedenlerden dolayı, bu S4'te doğru değil (teşekkürler Samsung!).

Bu yüzden, bunu düzeltmek için, bu aralık isteklerini ele almanız gerekecek. Benim durumumda sadece bir kere socket.accept()'u arıyordum. isRunning benim run() işlevimde doğru iken bir döngü içinde gerçekleştirilmek için bunu değiştirdim. Bu şekilde, yeni bir istek yapıldığında, düzgün bir şekilde ele alınır. Benim kodun aşağı bir sürümü bu gibi görünüyor ...

Bu yardımcı olur umarım.

+1

'un belirli sürümlerinde sorunun nasıl giderileceğinden emin değil. – adi

+0

Merhaba. Daha fazla kod paylaşmak mümkün mü? Bunu sadece belirli şarkılar ile karşı karşıya getiriyorum ve düzeltmek mümkün görünmüyor. – frostymarvelous

0

Kırık Boru genellikle diğer tarafı size bağlantıyı kapattı oluşur. Başlıkları doğru bir şekilde proxy olarak kullandığınızdan emin olun ve ardından iki yeni satırı vücutta atmadan önce koyun. Diğer ucunu beslediğiniz bir şey büyük olasılıkla bir soket kapatılmasını bekliyor .... Bu sadece S4'te oluyor? İçerik uzunluğunu gönderiyor musunuz?

+0

Evet, bu sadece galaksinin S4'ünde oluyor, yüzlerce başka cihazda sorun yok. AFAIK içerik uzunluğu 0'dır, çünkü teorik olarak hiç bitmeyen bir canlı akışdır. – SteveEdson

+0

İçerik uzunluğunu başlıkta gönderiyorum. Aksi takdirde, medya oynatıcı şarkının ne kadar süreceğini bilemeyecek ve bu nedenle süreyi göstermeyecektir. Bu büyük olasılıkla gerçekleşiyor (teyit edemememe rağmen) çünkü medya oynatıcı bir dizi talep yapıyor ve daha sonra doğru bilgiyi almıyor. Ancak, bu aralık isteğini nasıl durduracağımı bilmiyorum (diğer tüm telefonlarda http1.0 çalışmalarını gönderme). Ive ayrıca Not 2 ve LG Optimus G. – Nick