В соответствии с изменениями для 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;