Неожиданная строка состояния: ICY 200 в порядке для метода openStream(URL)?

В соответствии с изменениями для Kitakt 4.4 были некоторые проблемы с воспроизведением потоков shoutcast (те, которые возвращают "ICY" вместо ответа "HTTP/1.x").

Поэтому решение для kitkat состояло в том, чтобы перерегистрировать префикс "icy" протокола в JVM один раз, прежде чем мы открыли поток следующим образом:

try {
        java.net.URL.setURLStreamHandlerFactory( new java.net.URLStreamHandlerFactory(){
            public java.net.URLStreamHandler createURLStreamHandler( String protocol ) {
                Log.d( LOG, "Asking for stream handler for protocol: '" + protocol + "'" );
                if ("icy".equals( protocol )) return new com.spoledge.aacdecoder.IcyURLStreamHandler();
                return null;
            }
        });
}
catch (Throwable t) {
        Log.w( LOG, "Cannot set the ICY URLStreamHandler - maybe already set ? - " + t );
}

У меня проблема с открытым аудиопотоком, чтобы он регистрировался. После того, как я вызываю url.opnestream(stream), я получил исключение:

java.net.ProtocolException: неожиданная строка состояния: ICY 200 OK

Как я мог это исправить?


Вот пример регистрации аудио, пока что я сделал..

try {
    URL url = null;
    url = new URL(u);
    inputStream = url.openStream();

    startTime = System.currentTimeMillis();

    Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

    String fileName = File.separator + "radio_" + "recording_" + channelMetadata.replaceAll("\\W", "") + System.currentTimeMillis();

    if(isSDPresent)
    {
        outputSource = Environment.getExternalStorageDirectory() + fileName;
    }
    else
    {
        outputSource = Environment.getDataDirectory() + fileName;
    }

    if(contentType.equals("audio/aacp"))
        fileOutputStream = new FileOutputStream(outputSource  + ".acc");
    else if(contentType.equals("audio/mpeg"))
        fileOutputStream = new FileOutputStream(outputSource + ".mp3");
    else
        fileOutputStream = new FileOutputStream(outputSource + ".nieznany_format");

    int bytesRead = 0;
    int bytes;
    while (((bytes = inputStream.read()) != -1) && isRecording) {

        fileOutputStream.write(bytes);
        bytesRead++;

        stopTime = System.currentTimeMillis();

        long seconds = (Math.abs(startTime-stopTime));
        int minutes = 1000 * 60 * 60;

        if(minutes<=seconds)
        {
            Log.d("xxx", "recording task exceed stopped");
            break;
        }
    }

    inputStream.close();
    fileOutputStream.close();

} catch (IOException e) {
    e.printStackTrace();
    isRecording = false;
}

isRecording = false;
return null;

3 ответа

Решение

Различные изменения были сделаны для Android 4.4, и кажется, что нестандартный ShoutCastICY заголовок не поддерживается Android.

Похоже, что хорошие люди из OkHttp исправили проблему ( проблема 1 и проблема 2) уже несколько дней назад.
Что вы можете сделать, это просто использовать OkHttp lib непосредственно в вашем приложении, и тем самым вы будете использовать более новую версию OkHttp (ту, в которой исправлено), а не ту, которая поставляется с Android (где вам придется ждать ОС Обновить).
Это также исправит это для вашего приложения, работающего на других устройствах, которые могут страдать от этой проблемы.

Ответ Асафа Гамлиэля сработал для меня. Для тех, кто не знаком с этим, вы должны загрузить последний.jar из okHttp и.jar из зависимости okio. Добавьте их в каталог libs и подключитесь так:

OkHttpClient client = new OkHttpClient();
 Request request = new Request.Builder()
 .url(mediaUrl)
 .build();

 Response response = client.newCall(request).execute();
 InputStream stream = response.body().byteStream();

Самое простое исправление. который на 100% работает для меня, для shoutcast, измените свой URL, напр. " http://192.168.1.1:9292/" в "icy://192.168.1.1:9292", и все будет в порядке.

Другие вопросы по тегам