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

时间:2015-04-04 16:53:49

标签: android static callback facebook-login facebook-android-sdk

我正在为一个更大的项目实施Facebook登录。作为组织代码的尝试(并且我的意思是保持Activity与按钮尽可能干净)我想我可能已经打破了一些主要黑客的实际登录过程。但就我所知,它应该有效。想法是在登录后开始另一项活动。 这是我的MainActivity:

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活动才会闪烁,我回到了MainActivity。为什么会这样?我需要做些什么才能使用分离的代码实现有效的Facebook登录,使用来自Facebook的LoginButton

1 个答案:

答案 0 :(得分:2)

1)您应该在onCreate中注册回调,否则当您的活动因方向或大小更改而被回收时,您的回调将不会在新活动中重新添加。 2)您必须将结果传递回onActivityResult中的callbackManager。 3)如果您对主要活动保持静态引用,则可能有一个旧实例,如果主要活动被回收。您也应该在onCreate中新建一个回调管理器,并使其成为活动的类变量。

这样的事情:

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

}