在webview android中加载URL时出现问题

在webview android中加载URL时出现问题,android,webview,android-webview,Android,Webview,Android Webview,我需要在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屏幕

我需要在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

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

  • 当前它在浏览器中打开,而不是在webview中打开。但除上述链接外,应用程序内的其他链接正在webview中打开
  • 这是处理此事务响应的回调方法
  • 下面是我的代码:

    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;
        }
    }
    

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

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

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


    最后,在我看来,代码的注释版本将把您送入一个无限循环,就像您编写它的方式一样。您告诉web视图加载授权URL,这将返回到您的web客户端代码,这将捕获URL,导致它加载URL…

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

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

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


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

    如果我在shouldOverrideUrlLoading()方法中取消对代码的注释,它也将不起作用。您正在向浏览器发送处理URL的意图是,您打开浏览器的目的是。我认为你不需要一个自定义的webview,如果url是正确的,那么就添加url,或者打开浏览器,但是从活动中,而不是从webview。还有一些方法可以在android和WebView中的网页之间进行通信,但我认为发布答案太过广泛,因此我建议搜索教程如果我取消注释shouldOverrideUrlLoading()方法中的代码,它也不起作用。您正在向浏览器发送意图以处理您的URL是,您打开浏览器的目的是。我认为你不需要一个自定义的webview,如果url是正确的,那么就添加url,或者打开浏览器,但是从活动中,而不是从webview。另外,在网络视图中,android和网页之间也有交流的方式,但我认为要发布答案是不够的,所以我建议搜索教程,再加上一个注释。在您的web视图中直接处理身份验证被认为是不安全的,因为您自己的应用程序可能会嗅探密码或其他行为异常(从用户的角度来看)。最佳做法是使用系统浏览器加载身份验证页面。谢谢,现在我修改了shouldOverrideUrlLoading(WebView WebView,String url)以返回false并将其加载到WebView中。但我得到的是一张空白页。同样的URL在iOS上运行良好。有什么帮助吗?解决了空白问题,我必须把WebVIEW的高度设置为MatCH-PARTENT。如果答案有帮助,请投票和/或接受。谢谢,还有一张便条。在您的web视图中直接处理身份验证被认为是不安全的,因为您自己的应用程序可能会嗅探密码或其他行为异常(从用户的角度来看)。最佳做法是使用系统浏览器加载身份验证页面。谢谢,现在我修改了shouldOverrideUrlLoading(WebView WebView,String url)以返回false并将其加载到WebView中。但我得到的是一张空白页。同样的URL在iOS上运行良好。有什么帮助吗?解决了空白问题,我必须把WebVIEW的高度设置为垫子。