尝试在android上使用facebook登录sdk并组织代码
我正在为一个更大的项目在spike上实现Facebook登录。作为组织代码的一种尝试(我的意思是用按钮尽可能保持活动的干净),我想我可能已经用一些主要的黑客破坏了实际的登录过程。但据我所知,它应该会起作用。想法是在登录后启动另一个活动。 以下是我的主要活动:尝试在android上使用facebook登录sdk并组织代码,android,static,callback,facebook-login,facebook-android-sdk,Android,Static,Callback,Facebook Login,Facebook Android Sdk,我正在为一个更大的项目在spike上实现Facebook登录。作为组织代码的一种尝试(我的意思是用按钮尽可能保持活动的干净),我想我可能已经用一些主要的黑客破坏了实际的登录过程。但据我所知,它应该会起作用。想法是在登录后启动另一个活动。 以下是我的主要活动: public class MainActivity extends ActionBarActivity implements OnClickListener { @Override protected void onCr
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) {
}
};
}
公共类FacebookHelper{
public static final CallbackManager sCallbackManager=CallbackManager.Factory.create();
公共静态语境;
公共静态最终FacebookCallback sFacebookCallback=
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
意向意向=新意向(sMainActivityContext,SecondActivity.class);
SmaVityContext.startActivity(意向);
}
@凌驾
公开作废{
}
@凌驾
公共无效onError(FaceBook例外e){
}
};
}
但当我按下按钮时,Facebook的登录活动就会闪烁,我又回到MainActivity。为什么会发生这种情况?我需要做什么才能使用单独的代码实现facebook登录,而不是使用facebook上的登录按钮?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);
}
}
公共类MainActivity扩展了ActionBarActivity实现OnClickListener{
私人CallbackManager CallbackManager;
专用最终FacebookCallback FacebookCallback=
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
意向意向=新意向(此,SecondActivity.class);
星触觉(意向);
}
@凌驾
公开作废{
}
@凌驾
公共无效onError(FaceBook例外e){
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sdkinInitialize(getApplicationContext());
callbackManager=callbackManager.Factory.create();
setContentView(R.layout.activity_main);
按钮facebookLoginButton=(按钮)findViewById(R.id.btn\u facebook\u登录);
setOnClickListener(此);
loginManager.getInstance().registerCallback(callbackManager,
facebook(回调);
}
@凌驾
公共void onClick(视图){
开关(view.getId()){
案例R.id.btn\u facebook\u登录:
LoginManager.getInstance().logInWithReadPermissions(此,
asList(AppResources.sFacebookPermissions));
打破
}
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
callbackManager.onActivityResult(请求代码、结果代码、数据);
}
}
回答得很好,很有魅力,谢谢!很遗憾,我实际上无法分离代码,但我仍然更喜欢这种方式,而不是登录按钮。