尝试在 android 上使用 facebook 登录 sdk 并组织代码

Trying to use facebook login sdk on android and organize the code

我正在为一个更大的项目实施 Facebook 登录。作为组织代码的尝试(我的意思是让 Activity 和按钮尽可能干净)我想我可能已经用一些主要的 hack 破坏了实际的登录过程。但据我所知,它应该有效。这个想法是开始另一个 activity post-登录。 这是我的主Activity:

public class MainActivity extends ActionBarActivity implements OnClickListener {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login);
        facebookLoginButton.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_facebook_login:

                FacebookHelper.sMainActivityContext = getApplicationContext();
                LoginManager.getInstance().registerCallback(FacebookHelper.sCallbackManager,
                        FacebookHelper.sFacebookCallback);

                LoginManager.getInstance().logInWithReadPermissions(this,
                        Arrays.asList(AppResources.sFacebookPermissions));

            break;
        }

    }
}

黑客攻击本身 'FacebookHelper' :

public class FacebookHelper {

    public static final CallbackManager sCallbackManager = CallbackManager.Factory.create();

    public static Context sMainActivityContext;

    public static final FacebookCallback<LoginResult> sFacebookCallback =
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    Intent intent = new Intent(sMainActivityContext, SecondActivity.class);
                    sMainActivityContext.startActivity(intent);
                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException e) {

                }
            };

}

但是当我按下按钮时,用于登录的 Facebook activity 只是闪烁,我又回到了 MainActivity。为什么会这样?我需要做什么才能使用单独的代码实现有效的 facebook 登录,并且 not 使用来自 facebook 的 LoginButton?

1) 您应该在 onCreate 中注册回调,否则当您的 activity 由于方向或尺寸变化而被回收时,您的回调将不会添加回新的 activity。 2) 您必须将结果传回onActivityResult 中的callbackManager。 3) 如果您保留对 main activity 的静态引用,如果 main activity 被回收,您可能拥有它的旧实例。您还应该在 onCreate 中新建一个回调管理器,并将其设为 activity.

的 class 变量

像这样:

public class MainActivity extends ActionBarActivity implements OnClickListener {

    private CallbackManager callbackManager;


    private final FacebookCallback<LoginResult> facebookCallback =
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    Intent intent = new Intent(this, SecondActivity.class);
                    startActivity(intent);
                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException e) {

                }
            };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.activity_main);

        Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login);
        facebookLoginButton.setOnClickListener(this);
        loginManager.getInstance().registerCallback(callbackManager,
                        facebookCallback);
    }


    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_facebook_login:
                LoginManager.getInstance().logInWithReadPermissions(this,
                        Arrays.asList(AppResources.sFacebookPermissions));

            break;
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)   {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

}