Android SHOUTcast запрос - PullRequest
       2

Android SHOUTcast запрос

4 голосов
/ 25 ноября 2010

Я написал некоторый код на Java, который будет декодировать поток SHOUTcast и возвращать метаданные. Этот код работает как задумано, но когда я портирую его на Android, тот же код не работает. В частности, я не могу разобрать заголовок ответа HTTP с сервера SHOUTcast. Там, где я могу просто разобрать его вне 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 для запроса с тем же заголовком я получаю соответствующий ответ. Когда я смотрю на вывод logcat Android, «byteheader» содержит только мусор.

Моя единственная идея в том, что это что-то экологическое, что я пропускаю Или я упускаю что-то невероятно очевидное.

Есть идеи?

В качестве редактирования я дополнительно изолировал проблему, создав фиктивное приложение и поместив в него только код, вызывающий проблемы. Проблема сохраняется: Android возвращает мусор, а мой внешний код работает как положено. Я думал, что это может быть как-то связано с кодировкой символов, но похоже, что обе среды по умолчанию используют UTF8.

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Я наконец отследил проблему до URLConnection. Видимо, класс работает на моей локальной JVM иначе, чем на Android. За пределами Android URLConnection оставляет заголовок ответа без изменений. В Android заголовок ответа используется, и поток ввода начинается с первого байта данных. Информация заголовка доступна через getHeaderField.

Я не уверен, что понимаю эту разницу в поведении, и могу объяснить это только различием в версиях Java.

0 голосов
/ 07 декабря 2010

Используйте сокетное соединение, и оно должно работать.Shoutcast не предоставляет общего HTTP-соединения.

...