FacebookCallback.onCancel получает вызов при попытке входа в систему с помощью facebook sdk

У меня есть приложение для 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(). Обратите внимание, что я не использую LoginButton, предоставленный facebook, и у меня есть собственная кнопка (хотя я пробовал этот подход, и результат был таким же). Я дважды и тройной проверил свой идентификатор приложения и keyhash, сгенерированные приложением, и они выглядят корректно. Итак, я не знаю, что еще может быть неправильно. Любая помощь на этом этапе очень ценится.

Ответы

Ответ 1

да, я столкнулся с той же проблемой, разрешил ее, используя приведенный ниже код перед авторизацией

 LoginManager.getInstance().logOut();

Ответ 2

Причина такого поведения заключается в том, что вы уже вошли в систему. Поэтому, когда вы отменяете его, oncancel() вызывается вместо onsubmit(). Так что просто выполните выход на кнопку выхода из приложения, как это

Импорт →

import com.facebook.login.LoginManager;

Реализация →

LoginManager.getInstance().logOut();

Ответ 3

У меня была такая же проблема, в конце концов я нашел проблему. Активность, вызывающая фразу facebook login, содержала android:launchMode="singleInstance" в файле манифеста.

Ответ 4

Комментарий @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).

Ответ 5

Проблема была просто потому, что идентификатор APP должен был быть в двойных кавычках.

Ответ 6

Если кто-то столкнется с этим в будущем, это также может быть вызвано встроенным приложением Facebook, установленным на устройстве, блокирующим логирование по причине X.

В моем случае это бросалось каждый раз, когда я пытался войти в систему. Я, наконец, переключился на родное приложение Facebook, и, когда он был открыт, он потребовал аутентификации и снова зашел в систему из-за некоторой "подозрительной активности" (я думаю, что недавно я изменил свой номер).

Если вы делаете все, что указано выше, и пользователи все еще жалуются на это (и у них установлено приложение, вы можете использовать код внизу, чтобы узнать, установлено ли приложение 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;
    }
}