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