4

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 になっているようです。

4

2 に答える 2

4

最終的に問題を URLConnection まで追跡しました。どうやら、ローカル JVM でのクラスの動作は、Android での動作とは異なります。Android 以外では、URLConnection は応答ヘッダーをそのまま残します。Android 内では、応答ヘッダーが消費され、入力ストリームはデータの最初のバイトから始まります。ヘッダー情報は、getHeaderField を介して入手できます。

私はこの動作の違いを理解しているかどうか確信が持てず、Java のバージョンの違いだけを説明できます。

于 2010-11-25T17:29:15.773 に答える
0

ソケット接続を使用すると、動作するはずです。Shoutcast は一般的な HTTP 接続を提供しません。

于 2010-12-07T07:58:11.383 に答える