Вход в Facebook через Android не работает с установленным приложением Facebook

Я настроил простой вход в Facebook. Для Android 2.3.6 все работает как надо, пользователь получает запрос на вход в систему, вводит данные и приложение продолжает работу. Я думал, что это ошибка версий Android, но оказалось, что вход в систему не работает, когда на телефоне установлено приложение facebook!

Протестировано на: Galaxy Ace 2.3.6 HTC Desire 4.1.2 Galaxy Note 4.1.2 Эмулятор Android 4.1.2

Даже образцы facebook не работают!

Каждый раз, когда приложение выполняется - else { Log.d("SESSION NOT OPENED", "SESSION NOT OPENED"); }

Кажется, что сессия не открыта, но почему? Следуйте этому руководству — https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

Код:

Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(final Session session, SessionState state, Exception exception) {

            if (session.isOpened()) {

                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            Log.d("Access_token", session.getAccessToken());
                        }
                    }
                });
            } else {
                Log.d("SESSION NOT OPENED", "SESSION NOT OPENED");
            }
        }
    });

person Karlis    schedule 25.07.2013    source источник
comment
Почему Session session окончательный?   -  person BLaZuRE    schedule 25.07.2013
comment
Чтобы я мог получить, например, токен доступа пользователя внутри метода onComplete!   -  person Karlis    schedule 25.07.2013
comment
Эй, вы отключили режим песочницы на вкладке основной информации вашего приложения на странице разработчика facebook?   -  person Looking Forward    schedule 25.07.2013
comment
да. И я упомянул, что если я тестирую на Android 2.3.6, все работает нормально, и я получаю свой токен доступа, потому что для Android 2.3 вы получаете всплывающее диалоговое окно, в котором вы вводите свои учетные данные пользователя, но для Android 4.1 я не получаю это всплывающее диалоговое окно !   -  person Karlis    schedule 25.07.2013
comment
какую версию Facebook SDK вы используете?   -  person Looking Forward    schedule 25.07.2013
comment
Я использую facebook-sdk-3.0   -  person Karlis    schedule 25.07.2013
comment
Вы установили цель в свойствах, когда добавляли Facebook SDK в качестве проекта библиотеки?   -  person Looking Forward    schedule 25.07.2013
comment
Да, я все установил, и это работает на старых устройствах, но не на версиях 4.1. Я только что создал чистый проект и прошел шаг за шагом через руководство по началу работы с Facebook, и то же самое. Для 2.3 я получаю всплывающее окно для входа, и все работает нормально, но для 4.1 меня спрашивают, разрешаю ли я доступ к определенным вещам, и все, мои данные не т отображается!   -  person Karlis    schedule 25.07.2013
comment
Что такое state и exception при срабатывании этого кода? У вас есть активная сессия, которую нужно открыть? Поставьте там точку останова, изучите полное состояние.   -  person Delyan    schedule 25.07.2013
comment
Я узнал, что нет проблем с версией Android! Проблема в том, что я установил приложение facebook на свой мобильный телефон! Я не получаю запрос на вход в систему и не могу получить данные из этого приложения!   -  person Karlis    schedule 25.07.2013
comment
Может быть, есть способ заставить пользователя запрашивать логин вручную, не извлекая данные из приложения facebook?   -  person Karlis    schedule 25.07.2013


Ответы (6)


Ознакомьтесь с нижней частью шага 4: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

Если вы неправильно ввели хэш ключа приложения, вход в Facebook через всплывающее окно WebView (если приложение не установлено) все равно будет работать, но вход через родное приложение Facebook не будет.

Вы должны увидеть это исключение в LogCat:

com.facebook.http.protocol.ApiException: remote_app_id does not match stored id

Facebook SDK печатает свои исключения, так что в любом случае проверьте там, есть ли другие проблемы.

person antonyt    schedule 25.07.2013
comment
Пробовал это. Я получаю окно для установки разрешений, но в LogCat ничего не отображается, и пользователь не вошел в систему - person Karlis; 26.07.2013
comment
Собственно в этом и была проблема. Но Eclipse LogCat не показал никаких ошибок, но когда я запустил adb logcat в терминале, он показал ошибку, и оказалось, что я скопировал has без одного символа! - person Karlis; 26.07.2013

я пишу этот ответ для тех, кто использует Facebook SDK 4.X

Вы можете открыть портал входа в Facebook одним из двух способов:

  1. если у вас есть устройство Android с Android 1.9.X и Facebook App, установленным на устройстве под названием Native Login Метод здесь, вам не нужно использовать facebook WebView

  2. если вы не установили Facebook App на свое Android-устройство, тогда можно использовать WebView

поэтому для этого Facebook предоставьте 3 Constants

  1. NATIVE_ONLY (используется, когда вы хотите открыть только в приложении Facebook)
  2. WEB_ONLY(используется, когда вы хотите открыть только в WebView)
  3. NATIVE_WITH_FALLBACK(Рекомендуется Facebook обнаруживать и открывать webView, если приложение не установлено)

Подробнее см. ссылку ниже https://developers.facebook.com/docs/reference/android/current/class/LoginButton/ https://developers.facebook.com/docs/facebook-login/android/v2.2#troubleshooting

     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_ONLY);
     LoginButton.setLoginBehavior(LoginBehavior.WEB_ONLY);
person Rishabh Agrawal    schedule 18.08.2015

Получите хэш-ключ, используя эту функцию для обоих (отладка и выпуск apk) и поместите его в свое приложение на странице developer.facebook.com/apps.

private void calculateHashKey(String yourPackageName) {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                yourPackageName,
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

это мне очень помогает .. Надеюсь, это поможет и вам ..

person jignesh    schedule 29.04.2014

Похоже, я не смог получить данные, если у меня был активный сеанс facebook (из приложения facebook).

Поэтому, прежде чем я открою сеанс, я прошу принудительно войти в систему, даже если у пользователя открыт сеанс facebook из приложения facebook.

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

Итак, теперь все работает, но пользователь должен вводить данные вручную. Это не идеально, но это работает.

Даже образцы facebook не работали у меня с открытым приложением facebook.

Если у кого-то есть лучшее решение, не стесняйтесь предлагать.

person Karlis    schedule 25.07.2013

Если хэш-ключ сгенерирован неправильно, вы можете столкнуться с такими проблемами, как

Отображается собственный диалог входа в систему, но после принятия всплывающее окно с разрешениями исчезает, и в журнале cat ничего не происходит.

Но вход и общий доступ будут работать нормально, если собственное приложение на устройстве отключено (в этом случае диалоговое окно входа открывается в веб-представлении, и для этого не требуется правильный хеш-ключ)

Я столкнулся с той же проблемой и решил ее, получив хэш-ключ, используя этот код. Хэш-ключ отличался от сгенерированного с помощью openSSl и keytool.

и после обновления этого хеш-ключа в приложении Facebook все работает нормально

//================================== To Get Facebook Hash key Programmatically =========================//
    PackageInfo info;

     try {
            info = activity.getPackageManager().getPackageInfo("com.checkmyplanner", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                //String something = new String(Base64.encodeBytes(md.digest()));
                Log.e("hash key", something);
            }
        } catch (NameNotFoundException e1) {
            Log.e("name not found", e1.toString());
        } catch (NoSuchAlgorithmException e) {
            Log.e("no such an algorithm", e.toString());
        } catch (Exception e) {
            Log.e("exception", e.toString());
        }

Просто измените имя пакета и получите правильный хеш-ключ.

person HemangNirmal    schedule 11.04.2014

введите здесь описание изображения

Отключите режим SAndbox... Это позволит вашему приложению работать на всех устройствах. Попробуйте это решение

person Looking Forward    schedule 25.07.2013
comment
Я отключил режим песочницы! - person Karlis; 25.07.2013
comment
Режим песочницы не ограничивает, какие устройства могут запускать приложение, он ограничивает только кто может его использовать. - person Simon Forsberg; 25.09.2013