Android 尝试登录Facebook时显示空白白页的WebView
我正在网络视图中加载网页。点击Facebook登录,我会看到一个空白的白屏。被调用的URL如下:Android 尝试登录Facebook时显示空白白页的WebView,android,facebook,android-webview,Android,Facebook,Android Webview,我正在网络视图中加载网页。点击Facebook登录,我会看到一个空白的白屏。被调用的URL如下:https://m.facebook.com/dialog/oauth?access_token=... 以下是我的代码: onCreate(): CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); WebSettings webSettings = wvMain
https://m.facebook.com/dialog/oauth?access_token=...
以下是我的代码:
onCreate():
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
WebSettings webSettings = wvMain.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
//webSettings.setSupportMultipleWindows(true);
wvMain.setWebChromeClient(new UriChromeClient());
wvMain.setWebViewClient(new UriWebViewClient());
wvMain.loadUrl(myUrl);
UriWebViewClient
private class UriWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
wvMain.loadUrl(lastUrl);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
lastUrl = url;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
super.onReceivedSslError(view, handler, error);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
}
else if (url.startsWith("tel:")) {
//do something
return true;
} else if (url.startsWith("mailto:")) {
//do something
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
class UriChromeClient extends WebChromeClient {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(wvMain);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
}
}
UriChromeClient
private class UriWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
wvMain.loadUrl(lastUrl);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
lastUrl = url;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
super.onReceivedSslError(view, handler, error);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
}
else if (url.startsWith("tel:")) {
//do something
return true;
} else if (url.startsWith("mailto:")) {
//do something
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
class UriChromeClient extends WebChromeClient {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(wvMain);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
}
}
是我设置的webSettings.setSupportMultipleWindows(true)
在onCreate()中,应用程序崩溃,出现以下异常:IllegalArgumentException:父WebView无法承载自己的弹出窗口。请使用WebSettings.setSupportMultipleWindows(false)
谢谢你的帮助。这件事我已经坚持了好几天了
编辑:
基于评论中的链接问题,我将我的onCreateWindow
更改如下:
class UriChromeClient extends WebChromeClient {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
WebView wvMain = new WebView(mContext);
wvMain.setVerticalScrollBarEnabled(false);
wvMain.setHorizontalScrollBarEnabled(false);
wvMain.setWebViewClient(new UriWebViewClient());
WebSettings webSettings = wvMain.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
wvMain.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mContainer.addView(wvMain);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(wvMain);
resultMsg.sendToTarget();
return true;
}
}
现在应用程序并没有崩溃,但同样存在白/黑屏问题。通过将onCreateWindow更改为下面,我终于获得了登录屏幕:
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
wvMain.setVisibility(View.GONE);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
WebView wvNew = new WebView(mContext);
wvNew.setVerticalScrollBarEnabled(false);
wvNew.setHorizontalScrollBarEnabled(false);
wvNew.setWebViewClient(new UriWebViewClient());
WebSettings webSettings = wvNew.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
wvNew.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mContainer.addView(wvNew);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(wvNew);
resultMsg.sendToTarget();
return true;
}
但成功登录后,我会看到一个空白屏幕,但这是另一天的故事。请检查问题中关于空白屏幕的编辑,可能会看到