Ho un'app di streaming audio, che esegue un server proxy locale. Il server proxy locale effettua una connessione http a un'origine di streaming Internet, riceve e memorizza localmente i dati di streaming. Poi, all'interno della app, io uso MediaPlayer per connettersi al server proxy locale, utilizzando il metodolettore multimediale Android - come disabilitare la richiesta di intervallo? (streaming audio interrotto su Nexus 7)
mediaPlayer.setDataSource(...); // the url of the local proxy server
Tutto è andato bene (con un sacco di dispositivi Android e le diverse versioni del sistema operativo - 1,5 ... 4,0), fino al rilascio di Nexus 7.
In Nexus 7, il lettore multimediale rifiuta di riprodurre l'origine dal server proxy locale.
Quando ho dato un'occhiata ai log, sembra che MediaPlayer utilizzi internamente le richieste di intervallo. Il mio server proxy locale non gestisce quello. Restituisce HTTP/1.0 200 OK e i dati. Tuttavia, il lettore multimediale non piace questo e genera un'eccezione:
Caused by: libcore.io.ErrnoException
?:??: W/?(?): [ 07-18 00:08:35.333 4962: 5149 E/radiobee ]
?:??: W/?(?): : sendto failed: ECONNRESET (Connection reset by peer)
?:??: W/?(?): at libcore.io.Posix.sendtoBytes(Native Method)
?:??: W/?(?): at libcore.io.Posix.sendto(Posix.java:146)
?:??: W/?(?): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:
?:??: W/?(?): at libcore.io.IoBridge.sendto(IoBridge.java:473)
We requested a content range, but server didn't support that. (responded with 200)
Secondo le specifiche HTTP, se il server risponde con HTTP/1.0 invece 1.1, il client non deve sparare una richiesta di gamma (1.0 non lo supporta comunque),
anche se il server non supporta la richiesta di intervallo, dovrebbe andare bene, se risponde con 200 OK (e questo è quello che sto facendo), ma l'implementazione di MediaPlayer su Nexus 7 non piace.
ho preso uno sguardo a questa discussione: HTTP: How should I respond to "Range: bytes=" when Range is unsupported?
, dove essi sostengono che la risposta con 200 OK deve essere abbastanza buono, ma purtroppo non aiuta.
Non sono sicuro che si tratti di un problema con Jelly Bean o di un problema con l'implementazione di Nexus 7, ma per me è ancora un problema che devo risolvere.
Ancora, non ci sono richieste di intervallo su molti altri dispositivi Android, utilizzando la stessa app. Per qualche ragione queste richieste di portata stanno accadendo ora su Nexus 7. (Può succedere anche su altri dispositivi Android, ma ancora una volta, non mi è mai successo fino ad ora).
Qualsiasi modo possibile per disattivare le richieste di intervallo per MediaPlayer?
Se non ce ne sono, qualcuno può suggerire una soluzione rapida per la mia logica del server proxy (che cosa deve restituire esattamente, se riceve questa richiesta di intervallo?), Senza cambiare la mia altra logica, se possibile?
Sembra che forse devo restituire qualcosa come "HTTP/1.0 206 OK \ r \ nPartial Content \ r \ n \ r \ n", ma probabilmente ci dovrebbe essere qualche valore alla fine del contenuto parziale - non certo cosa dovrebbe essere questo.
Il vostro aiuto sarebbe apprezzato.
Thanks ..
Posso confermare che è un problema di Jelly Bean (non solo Nexus 7). È successo anche su diversi dispositivi Nexus, recentemente aggiornati da Ice Cream Sandwich a Jelly Bean. Qualcuno è riuscito a utilizzare MediaPlayer contro un server proxy locale presso Jelly Bean? – user1512464
Posso confermare anche questo problema (su Jelly Bean). Però non stiamo usando un proxy, accediamo al flusso audio direttamente attraverso il lettore multimediale. – pulse00
Sembra una regressione in Jelly Bean. Ho creato un problema sul bugtracker: https://code.google.com/p/android/issues/detail?id=35790 – pulse00