Итак, у меня есть приложение facebook SSO, реализованное в приложении для Android, и отправляю сообщение на стену FB. Все время в разработке, как в эмуляторе, так и на моем телефоне, все работало нормально. Я поставил хэш из моего файла debyg.keystore в приложение FB, все в порядке. Теперь, когда я экспортировал свое готовое приложение и подписал его, я выпустил новый хэш для ключа выпуска и поместил его в настройки приложений. Когда он установлен, он по-прежнему отлично работает на моем телефоне, но не на чужом. Поэтому я подключил другой телефон и проверил журналы, пытаясь отправить сообщение на стену. Каждый раз, когда вы получаете ответ:
02-10 19: 41: 04.802: D/Facebook-authorize (26750): Ошибка входа: invalid_key: несоответствие клавиш Android. Ваш ключ "pwrvr9ALAVF7yAL5pKmGWRwR8i0" не соответствует разрешенным клавишам, указанным в настройках вашего приложения. Проверьте настройки приложения на http://www.facebook.com/developers
Я снова и снова устанавливал свой телефон на других телефонах, но все тот же. Здесь фрагмент кода, который ведет либо к авторизации, либо затем отправляется на стену или отправляется прямо к стене:
// Check if connected to the internet first
if (connected())
{
//Get existing access_token if any
mPrefs = getPreferences(MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if(access_token != null)
{
facebook.setAccessToken(access_token);
}
if(expires != 0)
{
facebook.setAccessExpires(expires);
}
// Only call authorize if the access_token has expired.
if(!facebook.isSessionValid())
{
facebookAuthorizeAndPost(msg);
}
else
{
posToFBWall(msg);
}
}
else
{
Toast.makeText(getBaseContext(), "There been a problem connecting to Facebook. Please make sure you're connected to the internet and try again", Toast.LENGTH_SHORT).show();
}
И вот фрагмент, который делает фактическую авторизацию и делегирует метод postToFBWall() в случае успеха:
private void facebookAuthorizeAndPost(final String msg)
{
facebook.authorize(this, new String[] {}, new DialogListener() {
@Override
public void onComplete(Bundle values) {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
if (values.containsKey("access_token"))
{
posToFBWall(msg);
}
}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
Что-то здесь не так? Более того, то, что ошибка несоответствия ключа Android означает, почему это происходит? Все идеи, указатели были оценены.
Исходя из этой ошибки, я подозреваю, что это ключевая проблема, и что она была сгенерирована некорректно. Иногда инструкции keyhash просто не работают. Я столкнулся с аналогичными проблемами с получением правильного keyhash, несмотря на то, что следую инструкциям T.
Тем не менее, и чтобы быть уверенным, что у вас есть правильный ключ, я рекомендую использовать программу Android, которая сообщит вам правильную клавиатуру, например: http://www.easyfacebookandroidsdk.com/download/keyhash.zip
Все, что вам нужно сделать, это импортировать проект и подписать его с тем же хранилищем ключей, с которым вы подпишете свое приложение facebook. Затем просто установите и запустите его, и он отобразит keyhash.
ИЗМЕНИТЬ
Вы также можете дважды проверить, что ваш ключ "pwrvr9ALAVF7yAL5pKmGWRwR8i0" фактически указан как один из ключей вашего приложения на странице разработчика.
Я не знаю, разрешена ли ваша проблема прямо сейчас, но у меня была такая же проблема, как и вы, и теперь я нахожу полное решение.
У вас есть две среды для разработки: debug и подписанное приложение, когда вы используете эти команды для получения вашего ключа (keytool -exportcert -alias androiddebugkey -keystore ~ /.android/debug.keystore | openssl sha1 -binary | openssl base64), вы получаете ключ для debug.keystore, но когда вы подписываете приложение, вы получаете новый ключ, потому что ваше приложение использует новое хранилище ключей (хранилище ключей, созданное для вас). Вы можете получить свой "знак приложения" с помощью программы, которую TomJ рекомендовал http://www.easyfacebookandroidsdk.com/download/keyhash.zip, но вы должны подписать с тем же хранилищем ключей, которое вы используете в вашем приложении.