Android Webview上的Facebook登录按钮重定向到空白页面
我正在尝试使用一个facebook登录按钮,该按钮在Android Webview上使用JS facebook SDK。当我点击它打开一个新页面并重定向到。。。这是一个包含javascript代码的空白页面。网络视图就在这里 我正在使用:Android Webview上的Facebook登录按钮重定向到空白页面,android,facebook,facebook-javascript-sdk,android-webview,facebook-login,Android,Facebook,Facebook Javascript Sdk,Android Webview,Facebook Login,我正在尝试使用一个facebook登录按钮,该按钮在Android Webview上使用JS facebook SDK。当我点击它打开一个新页面并重定向到。。。这是一个包含javascript代码的空白页面。网络视图就在这里 我正在使用: webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setAppCacheEnabled(true); webview.getSettings().setJavaScr
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
谢谢大家! 您需要添加逻辑以重定向回您网站的原始url 为此,您需要首先创建一个新的java类,该类扩展类并覆盖onPageFinished方法,如下所示:
public class CustomWebViewClient extends WebViewClient
{
@Override
public void onPageFinished(WebView view, String url) {
//https://www.facebook.com/dialog/permissions.request
//actually works for me, but I put the URL you say is coming up
//blank in there instead, whatever works for you:
if(url.startsWith("https://www.facebook.com/dialog/oauth")){
String redirectUrl = "http://www.mydomain.com/MyApp/";
view.loadUrl(redirectUrl);
return;
}
super.onPageFinished(view, url);
}
}
其次,只需将其添加到您的网络视图中即可:
webview.setWebViewClient(new CustomWebViewClient());
一旦该页面加载完毕,它将重定向回您的原始页面我不知道当时我到底做了什么,但问题已经解决了。我会给你密码。试试看:)
好的,从我所知道的,这里发生的事情是oauth有两种“方式”工作,要么它会回调“到另一个页面”(就像弹出的“登录我”消失),要么它可以将你重定向到一个登录页面,然后在成功或失败后再重定向到另一个url(非弹出式风格)(类似于前向链接)。不幸的是,WebView似乎不太适合“回调到父页面”的风格,所以你必须做一些恶作剧,比如有第二个WebView(jincy的答案在这里,或者也请参见)。如果我需要为用户获得facebook权限,该怎么办?因此,我需要的是在按下权限页面中的ok按钮后重定向到原始url,而不是在此…@jincyaraham您找到解决方案了吗。我有同样的problem@Marc试试下面的解决方法谢谢。它看起来像我的代码。我不明白
url.startsWith(“https://m.facebook.com/v2.1/dialog/oauth“”
不关闭权限对话框。我会试试的
WebView browser,mWebviewPop;
private void open(){
browser = (WebView)findViewById(R.id.webView1);
browser.getSettings().setLoadsImagesAutomatically(true);
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setAppCacheEnabled(true);
browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
browser.getSettings().setSupportMultipleWindows(true);
browser.setWebViewClient(new MyBrowser());
browser.setWebChromeClient(new MyCustomChromeClient());
mContext=this.getApplicationContext();
browser.loadUrl(target_url);
MainActivity.this.progressBar.setProgress(0);
browser.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
});
}
private class MyBrowser extends WebViewClient {
String redirectUrl = "MY URL";
private void noInternet() {
WebView webview = (WebView) findViewById(R.id.webView1);
RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout);
RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout);
tryAgainLayout.setVisibility(View.VISIBLE);
webview.setVisibility(View.GONE);
webview.destroy();
progressLayout.setVisibility(View.INVISIBLE);
}
public void visible(){
WebView webview = (WebView) findViewById(R.id.webView1);
RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout);
RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout);
tryAgainLayout.setVisibility(View.INVISIBLE);
webview.setVisibility(View.INVISIBLE);
progressLayout.setVisibility(View.VISIBLE);
}
public void unvisible(){
WebView webview = (WebView) findViewById(R.id.webView1);
RelativeLayout tryAgainLayout = (RelativeLayout)findViewById(R.id.tryAgainLayout);
RelativeLayout progressLayout = (RelativeLayout)findViewById(R.id.progressLayout);
tryAgainLayout.setVisibility(View.INVISIBLE);
webview.setVisibility(View.VISIBLE);
progressLayout.setVisibility(View.INVISIBLE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String host = Uri.parse(url).getHost();
if (host.equals(target_url_prefix))
{
if(mWebviewPop!=null)
{
mWebviewPop.setVisibility(View.GONE);
baseLayout.removeView(mWebviewPop);
mWebviewPop=null;
}
return false;
}
if(host.equals("m.facebook.com"))
{
return false;
}
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
noInternet();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
visible();
}
@Override
public void onPageFinished(WebView view, String url) {
unvisible();
System.out.println("\n" +view.getUrl());
if(url.startsWith("https://m.facebook.com/v2.1/dialog/oauth")){
if(mWebviewPop!=null)
{
mWebviewPop.setVisibility(View.GONE);
baseLayout.removeView(mWebviewPop);
mWebviewPop=null;
}
view.loadUrl(redirectUrl);
return;
}
super.onPageFinished(view, url);
}
}
private class MyCustomChromeClient extends WebChromeClient
{
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
mWebviewPop = new WebView(mContext);
mWebviewPop.setVerticalScrollBarEnabled(false);
mWebviewPop.setHorizontalScrollBarEnabled(false);
mWebviewPop.setWebViewClient(new MyBrowser());
mWebviewPop.getSettings().setJavaScriptEnabled(true);
mWebviewPop.getSettings().setSavePassword(false);
mWebviewPop.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
baseLayout.addView(mWebviewPop);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebviewPop);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
MainActivity.this.setValue(newProgress);
super.onProgressChanged(view, newProgress);
}
}