Ответ 1
Если приложение Facebook установлено на устройстве, описанная ошибка будет поднята.
Удалите существующее приложение Facebook и запустите приложение; он работает хорошо. Это проблема с SDK.
Я получаю ошибку входа в систему с помощью Android Android SDK во время работы на устройстве. Я сделал все, что они указали, например, создав хэш и все.
Ошибка:
Facebook-authorize (5539): Ошибка входа: invalid_key Ошибка facebook: com.facebook.android.FacebookError: invalid_key
Если приложение Facebook установлено на устройстве, описанная ошибка будет поднята.
Удалите существующее приложение Facebook и запустите приложение; он работает хорошо. Это проблема с SDK.
Обновление: Я написал более подробное сообщение в блоге об этой проблеме и объяснил, как SSO вызывает его: http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/
Этот вопрос уже давно встречается здесь (и в Android Android SDK), но я собираюсь попытаться выполнить полное решение для тех, кто заканчивает эту тему.
Я разрабатывал с помощью Android Android SDK в сочетании с PhoneGap и подключался к Phonegap Facebook. Шаг аутентификации работал отлично пока я не перешел от развертывания на эмуляторе к реальному устройству. Сбой, который я видел при запуске adb logcat
, был следующим.
D/Facebook-authorize( 2194): Login failed: invalid_key
W/System.err( 2194): com.facebook.android.FacebookError: invalid_key
Я понятия не имею, почему это сработало на эмуляторе, но не сработало на устройстве. Я подозреваю, что у Facebook есть своя политика, позволяющая использовать неподписанные приложения .apk, потому что они не могут быть распределены.
Проблема в том, что Facebook нуждается в информации о ключе, используемом для подписания приложения, чтобы разрешить авторизацию. То, что я не знал, - это то, что среда Eclipse подписывает сборки автоматически, когда вы нажимаете их на устройство, используя хранилище отладки. Подробная информация о хранилище отладки Debug доступна в Документация для Android - Подписание приложений.
Чтобы предоставить Facebook информацию о подписи, вам нужно выполнить команду Jay, приведенную выше (здесь повторяется):
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Это генерирует короткую строку символов (которая может включать символы, такие как '=' или '/'), которые идентифицируют подпись, называемую сертификатом. Как только у вас есть это, вы должны отдать его Facebook.
Найдите свое приложение на странице Facebook для разработчиков (или создайте новый, если вы еще не установили его). После того, как вы на странице резюме приложения, выберите "Редактировать настройки", а затем выберите "Мобильные устройства" и "Устройства" с левой стороны. В разделе Android вы увидите окно для Key Hash. Вставьте строку сертификата из приведенной выше команды в это поле и нажмите "Сохранить".
Дайте ему несколько минут для распространения, и вы должны быть настроены!
Просто потратил пару часов на ту же проблему.
Когда вы экспортируете хэш-значение своего ключа, обязательно указывайте правильное хранилище ключей и псевдоним. Например, в:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore
| openssl sha1 -binary
| openssl base64
Если вы не используете ключ отладки для подписания APK, убедитесь, что keytool ссылается на хранилище ключей экспорта и что он использует указанный вами псевдоним. Вы увидите хранилище ключей и псевдоним, которые будут использоваться в экранах выбора "хранилища ключей" и "Выбор ключевых псевдонимов" на экране мастера приложений Android Eclipse export.
Кроме того, в разделе "Мобильные устройства и устройства" в настройках приложения я установил приложение "Родное приложение", а не "HTML 5/Mobile web", так как я работаю с Android-приложением (и iOS тоже).
Вы можете использовать этот код Java Android для генерации своего ключа:
try {
PackageInfo info = getPackageManager().getPackageInfo("**YOURPACKAGENAME**", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.i("PXR", Base64.encodeBytes(md.digest()));
}
}
catch (NameNotFoundException e) {}
catch (NoSuchAlgorithmException e) {}
Другая ловушка для новых игроков: если вы ошиблись в пароле хранилища ключей в
keytool -exportcert -alias androiddebugkey -keystore ~ /.android/debug.keystore | openssl sha1 -binary | openssl base64
он будет молча давать неправильный результат (дайджест неверного сообщения о пароле, я подозреваю).
Работа с промежуточными файлами позволяет избежать этого. Также можно использовать рабочий стол Linux.
Я исправил ошибку:
Если вы добавите Facebook.FORCE_DIALOG_AUTH
в строку авторизации:
mFacebook.authorize(
MundialRugby2011Activity.this,
new String[] {"publish_stream", "read_stream", "offline_access"},
Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener()
);
У меня была аналогичная проблема (invalid_key), и для меня было решение установить Cygwin (я использую Windows 7 64-bit) и регенерировать ключ оттуда. У меня есть совершенно другой ключ (а не на PowerShell), и теперь мое приложение действительно вписывается в систему очень хорошо.
Возможно, я решил проблему с неправильным ключом в Windows 7. См. мой отчет в Неверная ключевая проблема для приложения Android для вызова API Facebook.
Я потратил около четырех часов на решение такой проблемы (Windows 7, Eclipse). Утилита keytool действительно хитра. У меня уже установлен Eclipse.
Некоторые трюки для клавишных:
НЕ ИСПОЛЬЗУЙТЕ оболочку Windows (CMD) - всегда используйте Cygwin. Запуск keytool из CMD беззвучно приводит к неправильному хешу!
Помните, что правильный разделитель путей Unix, который вы должны использовать, это "/", а не "\"!
Я использовал Cygwin для Windows и iOS Bash, но оба дали мне неправильные ключи! Наконец, я нашел решение в Внедрение Facebook в ваше приложение недействительным ключом с keytool.
ProgrammerXR написали действительно полезный метод, который извлекает ключевой хэш прямо из подписанного приложения, установленного на устройстве - блестяще!
отредактирован:
Вышеупомянутая ссылка больше не работает, но вы можете получить более подробную информацию в документах Facebook (см. параграф "Устранение неполадок" в разделе "Запустить образцы" ) https://developers.facebook.com/docs/android/getting-started/#samples
Благодаря Facebook, теперь он дает ключ сам с исключением invalid_key. Используйте это значение и обновите его в настройках приложения. Я использую 64-разрядную машину Windows 7, и для меня ключ не имеет =
(равно) в конце, но он работал чисто.
Эта проблема, похоже, срабатывает, когда приложение Facebook установлено, поэтому SDK пытается использовать приложение для аутентификации. И эта часть, кажется, всегда терпит неудачу в моем случае.
Мое текущее обходное решение для решения этой проблемы - убедиться, что вместо этого запускается диалоговое окно входа в систему. Способ сделать это - вмешаться в FB_APP_SIGNATURE в Facebook.java(последняя версия SDK от Line 763 от GitHub), в моем случае я просто заменил последнюю часть "928a2" пустой строкой.
Поступая таким образом, кажется, что SDK возвращается в веб-диалог, и все работает.
Обратите внимание, что это не идеальное решение, но оно решает проблему с помощью SDK для Facebook, а приложение Facebook несовместимо на данный момент на Android.
Я использую Phonegap, а FB SDK → не получил правильный ключ, возможно, мне нужно использовать хэш-ключ службы сборки? Тем не менее, я просто положил в хэш-библиотеку кордовы, что это не совпадает с тем, что было в facebook.