if(session.isOpen()), вход в Facebook на Android всегда возвращает false
Я пытаюсь реализовать простое действие в своем приложении для Android, где пользователю предлагается войти через Facebook, чтобы получить "лайки" пользователя. Итак, сначала я тестирую простой логин через фейсбук. Я использую точный код "Начало работы с Facebook SDK для Android" - Шаг 6 ( https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/) но почему-то не работает. Когда я отладил код, я понял, что следующее условие:
if(session.isOpen())
ВСЕГДА возвращает значение false, хотя я уже зашел на Facebook. Я попробовал все, чтобы это исправить, но, похоже, ничего не работает.
Кто-нибудь имел эту проблему или знает, как ее исправить?
РЕДАКТИРОВАТЬ: я пытаюсь этот тест на моем телефоне напрямую, а не на эмуляторе. Я не знаю, может ли это быть проблемой.
Заранее спасибо!
И я попробовал это решение. Session.isOpened() возвращает false, даже если вы успешно вошли в Facebook, но использование java 6 или 7 все равно дало тот же хеш-ключ.
РЕДАКТИРОВАТЬ 2: Я также попробовал то же самое, но с немного другим подходом. http://sonyarouje.com/2011/09/18/facebook-hash-key-for-android-apps/ У меня все еще остается та же проблема. Метод session.isOpen() всегда возвращает false.
РЕДАКТИРОВАТЬ 3: Вот последний код, который я пробовал. Я не думаю, что есть какие-либо ошибки в logcat. В любом случае, я свяжу это здесь на всякий случай, если я что-то упустил.
package com.example.danandroidapp;
import java.util.Arrays;
import com.facebook.FacebookException;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.OnErrorListener;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private String TAG = "MainActivity";
private TextView lblEmail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lblEmail = (TextView) findViewById(R.id.lblEmail);
LoginButton authButton = (LoginButton) findViewById(R.id.authButton);
authButton.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(FacebookException error) {
Log.i(TAG, "Error " + error.getMessage());
}
});
authButton.setReadPermissions(Arrays.asList("basic_info", "email"));
authButton.setSessionStatusCallback(new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if(session.isOpened()) {
Log.i(TAG, "Access Token " + session.getAccessToken());
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if(user != null) {
Log.i(TAG, "User ID " + user.getId());
Log.i(TAG, "Email " + user.asMap().get("email"));
lblEmail.setText(user.asMap().get("email").toString());
}
}
});
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
И мой вывод logcat: https://www.dropbox.com/s/7qg9zbhlpikfovf/log.txt
4 ответа
У меня была похожая проблема, это было то, что хэш-ключ был неправильным в Facebook, следуя приведенному ниже коду, вы можете получить хеш-ключ, который был отправлен на Facebook. Просто скопируйте этот хэш-ключ и замените его. Это начнет работать.
try {
PackageInfo info = getPackageManager().getPackageInfo(
"your.root.package",
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) {
} catch (NoSuchAlgorithmException e) {
}
Вам не хватает переопределения onActivityResult (последний фрагмент кода в руководстве по началу работы).
OnActivityResult - это то, как информация поступает из приложения FB (или веб-просмотра) обратно в ваше приложение, и ее необходимо переопределить для обратного вызова в сеансе.
Вы должны добавить ключ хеш на Facebook разработчик, он работает для меня
private Session.StatusCallback statusCallback = new SessionStatusCallback();
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(final Session session, SessionState state,
Exception exception) {
try {
new_session = session;
if (state.equals(SessionState.OPENING)) {
}
if (state.equals(SessionState.OPENED)) {
}
if (state.equals(SessionState.CLOSED_LOGIN_FAILED)) {
try {
PackageInfo info = context.getPackageManager()
.getPackageInfo("your package name",
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));
}
Session.openActiveSession((Activity) context, true,
statusCallback);
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
}
}
catch(Exception e){}
}
}
//if session is closed
Session.openActiveSession((Activity) context, true,
statusCallback);