我正在为一个更大的项目实施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 不?
答案 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);
}
}