Android Webview上的Facebook登录按钮重定向到空白页面

时间:2012-09-08 00:42:33

标签: android facebook facebook-javascript-sdk android-webview facebook-login

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

我正在使用:

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

为了做到这一点,你需要首先创建一个扩展 WebViewClient 类的新java类,并覆盖 onPageFinished 方法,如下所示: / p>

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());

一旦该页面加载完毕,它将重定向回原始页面

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

好的,据我所知,这里发生的事情是有两种方式"要让oauth工作,要么回电,要么回到正常的页面" (比如popup"登录"消失),或者它可以将你重定向到登录页面,然后转到其他网址(非弹出式),成功或失败后(链式转发)。不幸的是,似乎WebView不太适合回放到父页面"风格,所以你必须做一些恶作剧,比如有第二个WebView(这里有jincy的回答,或者另见this)。