SHOUTcast ストリームをデコードしてメタデータを返すコードを Java で記述しました。このコードは意図したとおりに機能しますが、Android に移植すると同じコードが機能しません。具体的には、SHOUTcast サーバーからの HTTP 応答ヘッダーを解析できないようです。Androidの外部で問題なく解析できる場合、Androidを介してリクエストが行われた場合、ゴミだけが返されるようです。
関連するコードは次のとおりです。
URL u = new URL("http://scfire-mtc-aa01.stream.aol.com:80/stream/1074");
URLConnection uc = u.openConnection();
uc.addRequestProperty("Icy-MetaData", "1");
InputStream in = uc.getInputStream();
byte[] byteheader = new byte[512];
int c = 0;
int i = 0;
int metaint = 0;
while ((c = in.read()) != -1){
byteheader[i] = (byte)c;
if (i > 4){
if (byteheader[i - 3] == '\r' &&
byteheader[i - 2] == '\n' &&
byteheader[i - 1] == '\r' &&
byteheader[i] == '\n')
break;
}
i++;
}
このコードを Android で実行すると、「byteheader」バッファがオーバーフローします。Android 以外で実行すると、正常に機能します。さらに奇妙なことに、私は Wireshark を介して会話を盗聴し、Android から送信されたヘッダーをファイルにエコーしました。netcat を使用して同じヘッダーでリクエストを行うと、適切なレスポンスが返されます。Androidのlogcat出力を見ると、「byteheader」にゴミしか入っていません。
私の唯一の考えは、これは私が見落としている環境的なものだということです. または、非常に明白な何かが欠けています。
何か案は?
編集として、ダミーアプリを作成し、問題のあるコードのみを入れることで、問題をさらに分離しました。問題は解決せず、Android はガベージを返し、私の同一の外部コードは期待どおりに動作します。これは何らかの文字エンコーディングに関連しているのではないかと思いましたが、どちらの環境もデフォルトで UTF8 になっているようです。