FacebookCallback.onCancel在尝试使用Facebook sdklogin时被调用

我有一个Android应用程序,我正在尝试使用Facebook的SDK(版本4.1.0)获取令牌和login。 这是我的代码:

public class LoginActivity extends Activity { private CallbackManager callbackManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { AccessToken accessToken = loginResult.getAccessToken(); Log.v(TAG, "Facebook login was successful"); String authToken = accessToken.getToken(); // User authToken here: } @Override public void onCancel() { Log.v(TAG, "Facebook login was canceled"); } @Override public void onError(FacebookException e) { Log.e(TAG, "Facebook login failed: " + e.getMessage()); } }); Button facebook_button = (Button) findViewById(R.id.fbButton); facebook_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile")); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } } 

代码切换到facebook应用程序,并返回并调用OnActivityResult。 但是,每次调用的callback方法都是onCancel()。 请注意,我没有使用Facebook提供的LoginButton,我有我自己的button(虽然我尝试了这种方法,结果是一样的)。 我双倍和三倍检查我的应用程序ID和应用程序生成的keyhash,他们也看起来是正确的。 所以,我不知道还有什么可能是错的。 任何帮助在这一点是不胜感激。

是的,我面临着同样的问题,通过在login之前使用下面的代码来解决它

  LoginManager.getInstance().logOut(); 

这种行为背后的原因是你已经login。所以当你撤销它,oncancel()被调用,而不是onsubmit()。 所以只需要像这样在应用程序的注销button上执行注销

导入 – >

 import com.facebook.login.LoginManager; 

执行 – >

 LoginManager.getInstance().logOut(); 

我有同样的问题,最终我发现了这个问题。 调用Facebooklogin片段的活动在清单文件中有android:launchMode="singleInstance"

@杜鲁的评论导致我的解决scheme。 我使用Facebook的活动,而不是片段。

代替

  <activity android:name="com.facebook.FacebookActivity" android:screenOrientation="portrait" android:launchMode="singleTask" /> 

我需要写

  <activity android:name="com.facebook.FacebookActivity" android:screenOrientation="portrait" /> 

这个bug的讨厌之处在于它只发生在旧的Android版本上(比如4.4.2,而不是5.0)。

这个问题只是因为APP ID需要用双引号。

如果将来有人遇到这种情况,这也可能是由于设备上安装的Facebook本机应用程序因X原因阻止login而造成的。

就我而言,每次尝试login时都会抛出这个问题。 我终于切换到原生的Facebook应用程序,并打开它,它需要身份validation,并让我再次login,由于一些“可疑活动”(我想我最近改变了我的号码)。

如果你正在做上面列出的所有内容,并且用户仍然在抱怨(他们已经安装了应用程序,那么你可以使用底部的代码来查看是否安装了Facebook应用程序:)你可能希望包含一个对话框要求他们检查Facebook应用程序,并确保他们仍然login,然后提示他们修复任何错误,然后再返回到您的应用程序。

 //Code to check if Facebook app is installed: public static boolean doesUserHaveFacebookAppInstalled(Context context){ try{ context.getPackageManager().getApplicationInfo("com.facebook.katana", 0 ); return true; } catch( PackageManager.NameNotFoundException e ){ return false; } }