2013-05-13 8 views
8

Recentemente abbiamo ricevuto segnalazioni di audio non riprodotte nelle nostre app Android, sul Samsung Galaxy S4. L'app va bene su altri dispositivi.Problema di socket Android su Samsung Galaxy S4 (SGS4)

L'audio viene trasmesso tramite MediaPlayer. Viene salvato localmente utilizzando il metodo Android Socket.

L'avvertimento nella Logcat è causata da:

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

L'analisi dello stack è il seguente:

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. 

Il flusso viene riprodotto quando io commento il codice proxy, tuttavia, inizia a suonare per un secondo, quindi avvia il buffering per 2-3 secondi, prima di riprendere.

Qualsiasi soluzione sarebbe molto accettata.

ho trovato problemi simili, ma non sono stati risolti:

+0

Ho riscontrato lo stesso problema. Nessuna soluzione ancora :( – Nick

+0

Almeno io non sono l'unico. Ne hai ancora di più? Tutto ciò che puoi condividere per risolvere il problema? – SteveEdson

+0

Purtroppo no. Non ho nemmeno un S4 da testare su Ho visto questo su alcuni altri dispositivi oltre a S4, ma non sono stato in grado di individuare il problema. Aggiornerò qui se trovo qualcosa. – Nick

risposta

4

Ho finalmente capito il problema che stava causando questo. Come previsto, il lettore multimediale stava eseguendo richieste di intervallo nel tentativo di trovare le informazioni id3. Su altri telefoni semplicemente impostando la riga di stato dell'intestazione su HTTP/1.0 206 OK si impedisce al lettore multimediale di eseguire richieste di questo tipo. Tuttavia, per qualche strana ragione, questo non è vero su S4 (grazie a Samsung!).

Quindi, per risolverlo, sarà sufficiente gestire queste richieste di intervallo. Nel mio caso stavo chiamando solo socket.accept() una volta. Ho cambiato questo per essere eseguito in un ciclo mentre isRunning è vero nella mia funzione run(). In questo modo, quando viene eseguita una nuova richiesta, viene gestita correttamente. Una versione ridotta del mio codice appare così ...

public void run() { 

    while (isRunning) { 

     client = socket.accept(); 

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

    } 
} 

Spero che questo aiuti.

+1

non so come risolvere il problema. – adi

+0

Ciao. È possibile condividere qualche altro codice? Sto affrontando questo solo su alcune canzoni e non riesco a risolverlo. – frostymarvelous

0

rotto tubo di solito si verifica quando l'altro lato ha chiuso la connessione su di voi. Assicurati di collegare correttamente le intestazioni e poi inserisci le due nuove linee prima di lanciare il corpo. Qualcosa che stai alimentando dall'altra parte è probabile che richieda un socket close .... Questo succede solo su S4? Stai inviando la lunghezza del contenuto?

+0

Sì, questo succede solo sulla galassia S4, nessun problema su centinaia di altri dispositivi. AFAIK la lunghezza del contenuto è 0 perché è un live streaming che teoricamente non finisce mai. – SteveEdson

+0

Invio la lunghezza del contenuto nell'intestazione. Se non lo fai, il lettore multimediale non saprà per quanto tempo la canzone è e quindi non mostrerà la durata. Questo è molto probabile che accada (anche se non posso confermare) perché il lettore multimediale sta facendo una richiesta di intervallo e non sta ottenendo le informazioni giuste in seguito. Tuttavia, non so come interrompere questa richiesta di intervallo (l'invio di http1.0 funziona su tutti gli altri telefoni). Ho anche visto questo su alcune versioni della Nota 2 e l'LG Optimus G. – Nick

Problemi correlati