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 (将#修改为@)