在网络视图 android 中加载 URL 时出现问题
Issue in loading URL in webview android
我需要在 webview 中显示登录网页 link,link 如下所示
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 中打开。但除上述 link 外,其他 link 正在应用程序内的 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 浏览器的意图,又 returning true
。 return 值告诉 Android 您是控制加载页面 (true
) 还是将其留给网络视图 (false
)。如果您不控制 URL 的处理,Web 视图将尝试像普通页面一样加载它。
您还立即将 Web 视图定向到您在 onCreate
代码中的授权 URL。我认为这是您所看到的导航行为混淆的一部分。
对于这种身份验证过程,您不想覆盖加载 OTP 页面。让 web 视图像处理其他任何事情一样处理它。您要做的是捕获 URL 响应。您在 shouldOverrideUrlLoading
中的 if
语句应该捕获响应 URL,使用内容,并响应 true
让网络视图知道您已经处理了 [=28] =].其他一切都应该由网络视图处理。
最后,代码的注释版本在我看来会让您进入无限循环,就像您编写它的方式一样。您告诉 Web 视图加载授权 URL,这将返回您的 Web 客户端代码,这将捕获 URL,导致它加载 URL...
我需要在 webview 中显示登录网页 link,link 如下所示
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 中打开。但除上述 link 外,其他 link 正在应用程序内的 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 浏览器的意图,又 returning true
。 return 值告诉 Android 您是控制加载页面 (true
) 还是将其留给网络视图 (false
)。如果您不控制 URL 的处理,Web 视图将尝试像普通页面一样加载它。
您还立即将 Web 视图定向到您在 onCreate
代码中的授权 URL。我认为这是您所看到的导航行为混淆的一部分。
对于这种身份验证过程,您不想覆盖加载 OTP 页面。让 web 视图像处理其他任何事情一样处理它。您要做的是捕获 URL 响应。您在 shouldOverrideUrlLoading
中的 if
语句应该捕获响应 URL,使用内容,并响应 true
让网络视图知道您已经处理了 [=28] =].其他一切都应该由网络视图处理。
最后,代码的注释版本在我看来会让您进入无限循环,就像您编写它的方式一样。您告诉 Web 视图加载授权 URL,这将返回您的 Web 客户端代码,这将捕获 URL,导致它加载 URL...