微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Webview WebResourceResponse 用于使用 okhttp 的流连接如 MJPEG

如何解决Webview WebResourceResponse 用于使用 okhttp 的流连接如 MJPEG

我正在使用 web 视图通过单个 html 页面显示多个摄像头(以及其他数据)。问题在于,当使用标准 IMG 标签嵌入时,具有基本或摘要身份验证的 MJPEG 流将无法工作。

对于 Jpeg 静止图像,这很容易使用 shouldInterceptRequest 修复,然后使用 okhttp 发出实际请求,然后返回一个 WebResourceResponse 对象,JPEG 仍在正文中。

对于 MJPEG 流,我希望我可以做类似的事情,因为 okhttp response.body 提供和 WebResourceResponse 接受和 InputStream 为正文。

下面的代码片段确实连接并获得了 content_length = -1(未知)的 OK 响应。但是,当我返回 WebResourceResponse 对象时,webview 中的 IMG 标签显示黑色的“错误图片(几秒钟后也会触发“onerror”js 函数)。

我不知道如何调试这个,因为我找不到任何方法来了解为什么 IMG 标签不喜欢传递的对象。

也许需要做些什么/添加到 okhttp 代码中以进行流式连接?也许 WebResourceResponse 正在寻找特定的标头?

有什么想法吗???

(身份验证由 okhttpdigester 处理,效果很好)

OkHttpClient httpClient = digestermap.get(url.trim()).httpClient;

                Log.d("Proxy","Proxy for url " + url + qsf);
            
                Request request = new Request.Builder()
                        .url(url.trim() + qsf)
                        .build();

                Log.d("Proxy",request.toString());
                Long bftime = System.currentTimeMillis();
                Response response = httpClient.newCall(request).execute();
                Long ddelta = System.currentTimeMillis() - bftime;
                Log.d("Proxy","Request complete " + ddelta + " ms size:" + response.body().contentLength() +" " + response.message());

                if (mjpeg){
                    if (response.isSuccessful()){
                        // just return the stream,maybe it will work .... nopE
                        
                        Map<String,String> hmap = new HashMap<>();
                        for (Pair<? extends String,? extends String> ss : response.headers()){
                            hmap.put(ss.getFirst(),ss.getSecond());
                            //Log.d(TAG,"Proxy header " + ss.getFirst() + " " + ss.getSecond());
                        }

                        return new WebResourceResponse(response.header("content-type"),null,response.code(),response.message(),hmap,response.body().byteStream());
                    }else{
                        Log.d("Proxy","MJPEG Failed");
                        response.close();
                        httpClient.connectionPool().evictAll();
                        return null;
                    }
                }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。