Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 意外的状态行:URL openStream()方法的ICY 200 OK?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
根据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.opnestream(stream)后,我得到了异常:

我该怎么办呢?

这是注册音频的样本,到目前为止我做了什么..

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进行了各种更改,似乎Android不支持非标准的ShoutCast ICY标头.

似乎OkHttp的好人已经在几天前解决了这个问题(issue 1issue 2).
你可以做的只是直接在你的应用程序中使用Okhttp lib,你将使用更新的Okhttp版本(带有修复的版本),而不是Android附带的版本(你必须等待操作系统)更新).

这也将修复您在其他可能遇到该问题的设备上运行的应用程序.

大佬总结

以上是大佬教程为你收集整理的android – 意外的状态行:URL openStream()方法的ICY 200 OK?全部内容,希望文章能够帮你解决android – 意外的状态行:URL openStream()方法的ICY 200 OK?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。