我有一个Android应用程序,我正在尝试使用Facebook的SDK(版本4.1.0)来获取令牌并登录。这是我的代码:
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()
被调用。但是,每次调用的回调方法都是onCancel()
。请注意,我没有使用Facebook提供的LoginButton
,我有自己的按钮(虽然我尝试了这种方法,结果是一样的)。我对应用生成的应用ID 和 keyhash 进行了双倍和三倍检查,看起来也是正确的。所以,我不知道还有什么可能是错的。在这一点上的任何帮助非常感谢。
答案 0 :(得分:23)
是的我遇到了同样的问题,在登录前使用以下代码解决了这个问题
LoginManager.getInstance().logOut();
答案 1 :(得分:9)
此行为背后的原因是您已经登录。因此,当您撤消它时,会调用oncancel()而不是onsubmit()。因此,只需在您的应用程序的注销按钮上执行注销
导入 - &gt;
import com.facebook.login.LoginManager;
实施 - &gt;
LoginManager.getInstance().logOut();
答案 2 :(得分:4)
我有同样的问题,最终我发现了问题。调用facebook登录片段的活动在清单文件中有android:launchMode="singleInstance"
。
答案 3 :(得分:2)
而不是
<activity android:name="com.facebook.FacebookActivity"
android:screenOrientation="portrait"
android:launchMode="singleTask" />
我需要写
<activity android:name="com.facebook.FacebookActivity"
android:screenOrientation="portrait" />
这个错误令人讨厌的是它只出现在旧的Android版本上(例如4.4.2,而不是5.0)。
答案 4 :(得分:1)
如果有人在未来遇到这种情况,这也可能是由于X原因导致设备上安装的Facebook原生应用程序阻止登录造成的。
在我的情况下,我每次尝试登录时都会抛出这个。我终于切换到原生Facebook应用程序,当它打开时,它需要身份验证并让我再次登录,因为一些可疑的活动&#39; (我想我最近改了号码)。
如果您正在执行上面列出的所有操作并且用户仍在抱怨它(并且他们已经安装了应用程序,您可以使用底部的代码来查看是否已安装Facebook应用程序:)您可能希望包括一个对话框,要求他们检查Facebook应用程序,并确保他们仍然登录,这将提示他们修复任何错误,然后切换回您的应用程序。
//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;
}
}
答案 5 :(得分:1)
@Override
public void onCancel() {
accessToken = AccessToken.getCurrentAccessToken();
if (accessToken == null) {
Toast.makeText(LoginActivity.this, "Login unSuccessful..Please contact developer... ", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(LoginActivity.this, "Login Successful. ", Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(FacebookException error) {
Toast.makeText(getApplicationContext(), "Login attempt failed.", Toast.LENGTH_SHORT).show();
}
答案 6 :(得分:0)
问题仅仅是因为APP ID必须是双引号。