根据 kitakt 4.4 的更改,播放 Shoutcast 流会出现一些问题(那些返回“ICY”而不是“HTTP/1.x”响应的问题)。
因此,kitkat 的解决方案是在我们打开流之前在 JVM 中重新注册一次“icy”协议前缀:
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.openstream(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;
Android 4.4进行了各种更改,似乎非标准ShoutCast
ICY
Android 不支持标头。
看来善良的人们OkHttp https://github.com/square/okhttp修复了问题(issue 1 https://github.com/square/okhttp/pull/459 and issue 2 https://github.com/square/okhttp/issues/386)已经是几天前了。
您可以做的就是直接在您的应用程序中使用 OkHttp lib,这样您将使用较新的 OkHttp 版本(已修复的版本),而不是 Android 附带的版本(您必须等待操作系统更新)。
这也将为您在可能遇到该问题的其他设备上运行的应用程序修复该问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)