Я разрабатываю приложение для Android, которое интегрируется с Facebook. Я бы хотел:
- Позвольте пользователю войти в Facebook
- Получить адрес электронной почты пользователя на Facebook (может быть проксированный адрес электронной почты, что хорошо)
- Опубликовать на стене пользователя/временной шкале от его имени
Технически это будет:
- Аутентификация пользователя
- Запрос
email
- Запрос
publish_stream
1. Аутентификация пользователя
Я назвал Session.openActiveSession()
Session.StatusCallback
(я уже проверял, что нет активных открытая сессия заранее):
final Session.StatusCallback sessionStatusCallback = new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If session is just opened...
if(state == SessionState.OPENED)
{
// Handle success case here.
return;
}
};
};
// Start Facebook Login.
Session.openActiveSession(activity, true, sessionStatusCallback);
Мой обратный вызов вызывается после успешного входа в систему. Пока все хорошо.
2. Запросить email
разрешение
Это мой статус-ответ:
new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If token is just updated...
if(state == SessionState.OPENED_TOKEN_UPDATED)
{
// Handle success case here.
return;
}
};
};
Я запрашиваю разрешение с Session.requestNewReadPermissions()
:
final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_READ = {"email"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_READ);
// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
// Handle success case here.
return;
}
// Request permissions.
session.requestNewReadPermissions(new Session.NewPermissionsRequest(activity, permissionList));
Мой callback вызывается после разрешения. Пока все хорошо.
3. Запросить publish_stream
разрешение
Это мой статус-ответ:
new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If token is just updated...
if(state == SessionState.OPENED_TOKEN_UPDATED)
{
// Handle success case here.
return;
}
};
};
Я запрашиваю разрешение с Session.requestNewPublishPermissions()
:
final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_PUBLISH = {"publish_stream"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_PUBLISH);
// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
// Handle success case here.
return;
}
// Request permissions.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(activity, permissionList));
На этот раз мой обратный вызов не вызывается после разрешения.
Исследование
После дальнейшего расследования я обнаружил, что мой обратный вызов вызван com.facebook.Session#postStateChange(SessionState, SessionState, Exception)
:
void postStateChange(final SessionState oldState, final SessionState newState, final Exception exception) {
if (oldState == newState && exception == null) {
return;
}
/* ... */
}
Так как oldState
и newState
равны (оба являются SessionState.OPENED_TOKEN_UPDATED
, мой обратный вызов не вызывается.
Вопрос
Как я могу получать уведомления после получения разрешения на второй раз? Предполагаю ли я close()
сеанс и повторно открыть его из кеша?
Дополнительная информация
Мой Android Android SDK 3.0 загружается из здесь, о чем говорится в Facebook Начало работы с SDK для Android для Android.