尝试使用facebook sdk登录时,FacebookCallback.onCancel正在调用

时间:2015-06-14 01:19:21

标签: android facebook facebook-login facebook-sdk-4.0

我有一个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 进行了双倍和三倍检查,看起来也是正确的。所以,我不知道还有什么可能是错的。在这一点上的任何帮助非常感谢。

7 个答案:

答案 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)

@ Doru的评论引导我找到解决方案。我使用Facebook活动而不是片段。

而不是

    <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必须是双引号。