2014-02-16 7 views
6

В соответствии с изменениями для kitakt 4.4 возникли проблемы с воспроизведением потоков shoutcast (возвращающих «ICY» вместо ответа «HTTP/1.x»).Неожиданная строка состояния: ICY 200 OK для метода URL openStream()?

Так решение для KitKat было перерегистрировать «ледяной» префикс протокола в 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 (поток) я получил исключение:

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; 

ответ

8

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

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

4

Ответ Ассафа Гамлиэля работал на меня. Для тех, кто не знаком с этим, вам необходимо загрузить последний .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(); 
-1

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