3

在我的应用程序中,我想让用户能够使用他们的 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);
        }
    }
}
4

2 回答 2

4

我会得到 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() {}
    });

你可以在这里看到:http: //developers.facebook.com/docs/guides/mobile/#android

于 2011-07-20T20:49:06.750 回答
2

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

编辑:Facebook 刚刚更新了他们的登录程序: https ://developers.facebook.com/docs/offline-access-deprecation/ 如您所见,现在您从 SSO(或任何其他客户端令牌)获得的令牌仅链接到您的应用程序(有一个验证令牌-应用程序 ID-应用程序秘密)。端点现在是

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 sdk for android 的步骤是:1)让用户签名 2)将令牌发送到服务器 3)服务器将根据其应用程序 ID 和应用程序秘密验证令牌 4)添加您自己的安全功能

于 2012-01-17T12:52:06.850 回答