2

我正尝试使用在Android Web视图上使用JS Facebook SDK的Facebook登录按钮。当我点击它打开一个新页面,并重定向到https://www.facebook.com/dialog/oauth ...这是一个JavaScript代码的空白页面。 webview保持在这里。Android Webview上的Facebook登录按钮重定向到空白页

我使用:

webview.getSettings().setJavaScriptEnabled(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 

谢谢!

回答

2

您需要添加逻辑重定向回到您网站的原始网址。

为了做到这一点,你需要首先创建一个扩展WebViewClient类和覆盖onPageFinished方法这样一个新的Java类:

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

webview.setWebViewClient(new CustomWebViewClient()); 

一旦页面被加载完成,它会重定向回您的原始页面

+0

如果我需要获取用户的Facebook权限,该怎么办?所以我需要的是重新定向到原来的网址后按权限页面中的确定按钮,而不是在这个https://www.facebook.com/dialog/oauth .... –

+0

@jincyabraham你找到一个解决方案。我有同样的问题 – Marc

+0

@Marc请尝试下面的解决方案 –

2

我不知道我当时做了什么,但问题解决了。我会给你的代码。试着找出:)

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); 
    } 
} 
+0

谢谢。它看起来像我的代码。我不明白'url.startsWith(“https://m.facebook.com/v2.1/dialog/oauth”)不会关闭权限对话框。我会尝试 – Marc

0

行,所以从我可以告诉,这里发生了什么是有两个“办法”对OAuth的工作,要么它会调用回“到aparent页”(如弹出“登录我“登录),或者它可以将你重定向到一个登录页面,然后到另一个URL(非弹出式样式),在成功或失败之后(一种链式向前)。不幸的是,它看起来WebView并不适合“回调父页面”风格,所以你必须做一些欺骗,比如有第二个WebView(jincy在这里的答案,或者也参见this)。

相关问题