首页 > 解决方案 > 在 webview android 中加载 URL 的问题

问题描述

我需要在 webview 中显示一个登录网页链接,该链接如下所示

url = "https://test-dev.test.com/as/authorization.oauth2?client_id=com.test.td&response=code&value=id test mail&redirect_uri=com.test.ap://oauth2/test"; 

[修改了不同名称的实际 URL]

在这个页面上,我们必须输入用户名和密码。单击登录将带您进入 OTP 屏幕,输入 OTP 结果后将是一个 url 响应,我需要从中读取代码。使用此代码,我必须发出请求以获取会话的身份验证令牌。对于令牌请求,响应将是 Json。

现在我需要帮助来解决以下问题:

  1. 目前它在浏览器中打开,而不是在 webview 中。但除上述链接外,其他链接正在应用程序内的 webview 中打开。
  2. 这是处理来自此事务的响应的回调方法。

下面是我的代码:

private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    webView = (WebView) findViewById(R.id.webView);
    webView.setWebViewClient(new MyWebViewClient());
    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    webView.loadUrl(getAuthorizationURL());
    webView.setHorizontalScrollBarEnabled(false);
    webView.setWebContentsDebuggingEnabled(true);
    //  webView.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer");    
}


    private String getAuthURL() {
    Uri.Builder builder = new Uri.Builder();
    builder.scheme("https")
            .authority("test-dev.test.com")
            .appendPath("ta/authorization.oauth2")
            .appendQueryParameter("client_id", "com.test.td")
            .appendQueryParameter("response", "code")
            .appendQueryParameter("value", "id test mail").appendQueryParameter("redirect_uri", "com.test.ap://oauth2/test")

    String url = Uri.decode(builder.build().toString());

    //url = "https://www.google.com/";
    // url = "https://developers.google.com/webmaster-tools/search-console-api/about";

    return url;
}


 private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url) {

        System.out.println(" shouldOverrideUrlLoading :============ " + Uri.parse(url).getHost() + " url " + url);

        //            if(url.contains("dev.test.com")){
        //                webView.loadUrl(url);
        //                return false;
        //            }
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(i);
        return true;
    }
}

标签: androidwebviewandroid-webview

解决方案


这听起来像是在进行 OpenID 身份验证。您正在执行的shouldOverrideUrlLoading()既是触发一个最有可能转到默认 Web 浏览器的意图,又是返回true. 返回值告诉 Android 您是控制加载页面 ( true) 还是将其留给 Web 视图 ( false)。如果您不控制处理 URL,Web 视图将尝试像普通页面一样加载它。

您还可以立即将 Web 视图定向到onCreate代码中的授权 URL。我认为这是对您所看到的导航行为的困惑的一部分。

对于这种身份验证过程,您不希望覆盖加载 OTP 页面。让 web 视图像其他任何东西一样处理它。您要做的是捕获 URL 响应。您if在其中的语句shouldOverrideUrlLoading应该捕获响应 URL、使用内容并响应true以让 Web 视图知道您已经处理了该 URL。其他一切都应由 Web 视图处理。

最后,在我看来,代码的注释版本会让你陷入无限循环,就像你编写它的方式一样。您正在告诉 Web 视图加载授权 URL,这将返回到您的 Web 客户端代码,该代码将捕获 URL,导致它加载 URL...


推荐阅读