android - 在 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。
现在我需要帮助来解决以下问题:
- 目前它在浏览器中打开,而不是在 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 视图将尝试像普通页面一样加载它。
您还可以立即将 Web 视图定向到onCreate
代码中的授权 URL。我认为这是对您所看到的导航行为的困惑的一部分。
对于这种身份验证过程,您不希望覆盖加载 OTP 页面。让 web 视图像其他任何东西一样处理它。您要做的是捕获 URL 响应。您if
在其中的语句shouldOverrideUrlLoading
应该捕获响应 URL、使用内容并响应true
以让 Web 视图知道您已经处理了该 URL。其他一切都应由 Web 视图处理。
最后,在我看来,代码的注释版本会让你陷入无限循环,就像你编写它的方式一样。您正在告诉 Web 视图加载授权 URL,这将返回到您的 Web 客户端代码,该代码将捕获 URL,导致它加载 URL...
推荐阅读
- c# - 以编程方式修改 Windows 鼠标滚动属性
- vba - vb.net 错误当前连接处于打开状态
- react-native - 当任何项目更改在选项卡视图中
- r - 过滤患者数据 - 如何为服用两种不同药物的患者返回布尔值/字符串?
- python - 使用 np.ix_ 的 Numpy 并行索引
- python - 如何阅读机器人 DM 并将其转发到使用 discord.py 的频道?
- python - Pandas - 将多行加入一行,多列
- sql-server - 如何在 CosmosDB 中的用户表中强制执行全局唯一性
- python - selenium.common.exceptions.WebDriverException:消息:服务 .\geckodriver.exe 意外退出。状态码为:3221225595
- javascript - 我如何在其他组件内使用我的增量值