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