Запрос SHOUTcast для Android

Я написал код на 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.


person zchtodd    schedule 25.11.2010    source источник
comment
Как играть в SHOUTcast?stackoverflow.com/a/8833346/265167   -  person Yaqub Ahmad    schedule 12.01.2012


Ответы (2)


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

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

person zchtodd    schedule 25.11.2010
comment
Просто убедившись, что я правильно читаю ваше решение - вы, по сути, смогли добавить uc.getHeaderField('whatever') в свой цикл байтового потока и могли получить новейшее название песни? Кажется... слишком просто. :) - person FunnyLookinHat; 13.03.2011
comment
@FunnyLookinHat, действительно, это было бы слишком просто. Моя проблема заключалась в том, что мой ошибочный учет заголовка вызывал смещение, из-за которого поток выглядел как мусор, когда я пытался выбрать метаданные. - person zchtodd; 13.03.2011

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

person Rafael    schedule 07.12.2010