ローカル プロキシ サーバーを実行するオーディオ ストリーミング アプリがあります。ローカル プロキシ サーバーは、インターネット ストリーミング ソースへの http 接続を確立し、ストリーミング データをローカルで取得してバッファリングします。次に、アプリ内で MediaPlayer を使用してローカル プロキシ サーバーに接続し、次のメソッドを使用します。
mediaPlayer.setDataSource(...); // the url of the local proxy server
Nexus 7 がリリースされるまでは、すべて問題ありませんでした (多くの Android デバイスとさまざまな OS バージョン - 1.5...4.0)。
Nexus 7 では、メディア プレーヤーがローカル プロキシ サーバーからのソースの再生を拒否します。
ログを見てみると、MediaPlayer は範囲リクエストを内部的に使用しているようです。私のローカルプロキシサーバーはそれを処理しません。HTTP/1.0 200 OK とデータを返します。ただし、メディア プレーヤーはそれを好まず、例外をスローします。
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)
http の仕様によると、サーバーが 1.1 ではなく HTTP/1.0 で応答する場合、クライアントは範囲要求を発行してはなりません (1.0 はとにかくそれをサポートしていません)。
また、サーバーが範囲要求をサポートしていない場合、200 OK で応答する場合は問題ありません (これが私が行っていることです) が、Nexus 7 の MediaPlayer 実装はそれを好みません。
このスレッドを見てみました: HTTP: Range is unsupported?
、彼らは 200 OK の応答で十分であると主張していますが、残念ながらそれは役に立ちません。
これが Jelly Bean の問題なのか、具体的には Nexus 7 の実装の問題なのかはわかりませんが、解決しなければならない問題です。
繰り返しますが、同じアプリを使用している他の多くの Android デバイスでは範囲要求はありません。何らかの理由で、これらの範囲リクエストは現在 Nexus 7 で発生しています (他の Android デバイスでも発生する可能性がありますが、これまでのところ発生したことはありません)。
MediaPlayer の範囲リクエストを無効にする方法はありますか?
何もない場合、可能であれば他のロジックを変更せずに、プロキシサーバーロジックの簡単な修正を提案できますか (この範囲リクエストを受信した場合、正確に何を返す必要がありますか?)
「HTTP/1.0 206 OK\r\nPartial Content\r\n\r\n」のようなものを返さなければならないようですが、おそらく部分コンテンツの最後に何らかの値があるはずです-何が必要なのかわかりませんこれであってください。
あなたの助けをいただければ幸いです。
ありがとう..