首先我上网冲浪,但没有找到符合我情况的答案。 我想从网络视图中获取特定的重定向网址,然后阻止网络视图打开它。该案例是用户授权我的应用程序后的 Instagram 重定向网址。怎么做?这是我的代码:
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://api.instagram.com/oauth/authorize/?client_id=my_client_id&redirect_uri=my_redirect_uri&response_type=code");
在加载 url 之前,您必须为您的 webview 设置自定义 WebviewClient 重写 shouldOverrideUrlLoading 方法。
mWebView.setWebViewClient(new WebViewClient()
{
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url)
{
return shouldOverrideUrlLoading(url);
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
{
Uri uri = request.getUrl();
return shouldOverrideUrlLoading(uri.toString());
}
private boolean shouldOverrideUrlLoading(final String url)
{
Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);
// Here put your code
return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
}
});
mWebView.loadUrl("Your URL");
查看用于在 Web 视图中处理重定向 URL 并无需下载即可打开 PDF 的示例代码。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500
您应该重写shouldOverrideUrlLoading:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView wView, String url) {
if (url.indexOf('api.instagram.com') > -1) //check if that's a url you want to load internally
{
webView.loadUrl(url);
return true;
}
else
{
return false; //Let the system handle it
}
}
});
最后感谢Udi对我的问题的回答,经过一点改变,我设法找到了问题的解决方案。这是对我有用的代码:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView wView, String url) {
return (url.indexOf("some part of my redirect uri") > -1);
}
});
webView.loadUrl(myUrl); //myUrl is the initial url.
使用上面的代码,如果有任何url包含redirect uri,webView将不会加载它。否则,webView 将加载它。还要感谢卡米尔·卡明斯基。
只需为您的
WebViewClient
设置 WebView
,然后覆盖 shouldOverrideUrlLoading
中的 WebViewClient
。在该方法中,您可以获取您的网址,并决定您的 WebView
是否应遵循重定向网址。例子如下:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// here you can assign parameter "url" to some field in class
// return true if you want to block redirection, false otherwise
return true;
}
});
您可以比较 URL 字符串/特定单词,并采取相应的操作 -
public boolean shouldOverrideUrlLoading(WebView view, String url) {
super.shouldOverrideUrlLoading(view, url);
if (url.contains(".pdf")
openPDF(url); // handle pdf opening
if(url.startsWith("tel:")
callNumber(url); // handle call processing
...
}
仅添加更多内容,您可以阻止 webview 显示传统的错误消息屏幕,或绕过已知错误 -
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
if (errorCode == -10) {
System.out.println("Error occured: Error code: "
+ errorCode + "..Ignoring this error");
return;
}
else
{
// Show your custom screen to notify error has occured
}
...
}
解决WebView中重定向URL问题可以参考这个答案