Android Webview Facebook登录

Android Webview Facebook登录,android,facebook,login,webview,webviewclient,Android,Facebook,Login,Webview,Webviewclient,在我的应用程序中,我想让用户能够使用他们的Facebook帐户登录。经过一些搜索,我能够找出这一点,虽然我不认为这是最好的方法。我在UI中使用webview,并使用webviewclient来感知url切换。据我所知,在Android上,我必须处理我的webviewclient中的所有重定向(Facebook重定向,当用户设置他/她的电子邮件和密码时会发生多次重定向)。但我所需要的只是解析输出xml并根据输出结果做出决定(重定向到我的主页活动或失败等)。这是我的代码,如果有更合适的方法,请给出你

在我的应用程序中,我想让用户能够使用他们的Facebook帐户登录。经过一些搜索,我能够找出这一点,虽然我不认为这是最好的方法。我在UI中使用webview,并使用webviewclient来感知url切换。据我所知,在Android上,我必须处理我的webviewclient中的所有重定向(Facebook重定向,当用户设置他/她的电子邮件和密码时会发生多次重定向)。但我所需要的只是解析输出xml并根据输出结果做出决定(重定向到我的主页活动或失败等)。这是我的代码,如果有更合适的方法,请给出你的建议

public class FbLoginActivity extends Activity {

    String fbLoginBaseUrl = "{my server url}/facebook/redirector.jsp?";
    private ProgressDialog progressBar; 
    WebView webView;
    int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fb_login);

        fbLoginBaseUrl += "usdId=NoSession:";
        fbLoginBaseUrl += Subroutines.getInstance().getDeviceId() + "_L";

        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Page is loading...");
        webView.setWebViewClient(new HelloWebViewClient());

        webView.loadUrl(fbLoginBaseUrl);

    }

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            Log.v(Subroutines.TAG, url);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.i(Subroutines.TAG, "Finished loading URL: " +url);

            // if login screen loading finishes, cancel the progressdialog..
            // twice redirecting happens to this sub url..
            String subFace = "m.facebook.com/login.php";
            if(url.indexOf(subFace) != -1 && ++count == 2){
                if (progressBar.isShowing()) {
                    progressBar.cancel();
                }
            }
            // Permission redirecting..
            String loginSub = "www.facebook.com/connect/uiserver.php?method=permissions.request";
            if(url.indexOf(loginSub) != -1){
                progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Logging in...");
            }
            // finally if my server makes a response..
            String sub = "{my server url}/facebook/connect.jsp";
            if(url.indexOf(sub) != -1){
                Log.v(Subroutines.TAG, "my server makes a response..");

                // xml parsing stuff..
                // use url content to parse
            }
        }
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.e(Subroutines.TAG, "Error: " + description);
        }
    }
}

我会得到Facebook SDK并使用它们的功能

简而言之,您可以这样做:

public Facebook facebook = new Facebook("appID");
然后在“创建”或“任意位置”中:

facebook.authorize(this,String[] YourNeededPermissions, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {}

        @Override
        public void onFacebookError(FacebookError error) {}

        @Override
        public void onError(DialogError e) {}

        @Override
        public void onCancel() {}
    });

你可以看到这一点

实际上,我在将facebook注册与我自己的注册集成时遇到了类似的问题(但我不是android开发者)。 我在这里问了这个问题 但是我不知道网络视图。这似乎是一个很好的解决方案,我可以通过聊天或其他方式与您联系吗

编辑: Facebook刚刚更新了他们的登录程序: 如您所见,现在您从SSO获得的令牌(或任何其他客户端令牌)仅链接到您的应用程序(存在验证令牌app id app secret)。 终点现在是

https://graph.facebook.com/oauth/access_token?             
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN 
因此,使用facebook android sdk的步骤如下: 1) 让用户签名 2) 将令牌发送到服务器 3) 服务器将根据其应用id和应用机密验证令牌
4) 添加您自己的安全功能

此外,如果您仔细查看,您会发现存储facebook会话的简单方法。然后,您可以在使用facebook之前检查SessionStore.restore(facebook,此)。授权(如果为true,则用户已登录,如果为false,则授权将提示他们登录)谢谢,这是一个很好的方法,但我的服务器处理facebook授权。在facebook登录之后,我的服务器返回一个会话id,我将这个id和设备id结合起来,用于安全和其他重要内容。