Android webView shouldInterceptRequest - 停止加载资源

3

我正在尝试拦截并停止加载webView上的所有mp4视频,为此我使用shouldInterceptRequest。我能够拦截视频并显示对话框,但是我无法停止加载它们,有任何想法吗?

webView.setWebViewClient(new WebViewClient() {
    @SuppressWarnings("deprecation")
    @Override
    public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
        try { 
            if (url.contains(".mp4?")) {
                return getResponseData();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.shouldInterceptRequest(view, url);
    }

    private WebResourceResponse getResponseData() {
        try {
            String str = "Access Denied";
            InputStream data = new ByteArrayInputStream(str.getBytes("UTF-8"));
            return new WebResourceResponse("text/css", "UTF-8", data);
        } catch (IOException e) {
            return null;
        }
    }

你确定你的 getResponseData 方法没有返回 null 吗?这会导致视频继续加载。你尝试使用 IDE 调试应用程序以查看它到底在做什么了吗? - NasaGeek
if(url.contain(".mp4?")) 后面加上一个日志。为什么在 .mp4 后面要加上 ??如果日志不显示,请使用 if(url.endsWith(".mp4")) - mehdok
4个回答

4
这可能会对您有所帮助:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
    if (yourCondition) {
        Handler handler = new Handler(getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                YourwebView.stopLoading();
                YourwebView.doAnythingYouWant();
            }
        });
    }
    return super.shouldInterceptRequest(view, request);
}

我创建了这个线程,因为在当前正在运行的线程上调用WebView方法(即stopLoading())会导致错误,而该线程是“Chrome_FileThread”。

此外,使用getMainLooper(),因为在上述情况下,我们无法在未调用Looper.prepare()的线程中创建处理程序

希望这可以帮助您。


3
如果您的HTML页面不能显示mp4内容或无法处理无效内容,则可以像下面所示简单地将一些虚拟InputStream传递给WebResourceResponse。
my_webview.webViewClient = object : WebViewClient() {
    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
        if (request?.url?.contains(".mp4") == true) {
            val inputStream = "".byteInputStream(Charset.defaultCharset())
            return WebResourceResponse("image/png", "UTF-8", inputStream)
        } else {
            return super.shouldInterceptRequest(view, request)
        }
    }
}

0

试试这个

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                if (yourCondition) {
                    webView.post(new Runnable() {
                        @Override
                        public void run() {
                            webView.stopLoading();
                        }
                    });
                }

                return null;
            }

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

我认为你想要的方法是这个

webView.setWebViewClient(new WebViewClient(){
  @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
               // code goes here
    }
});

以上的问题有什么进展了吗? - Mark Gilchrist
实际上,我需要的方法是shouldInterceptRequest,不管怎样还是谢谢你。 - Pedro Lobito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接