Решение пользователя2403096 хорошо работает, но я столкнулся с некоторыми проблемами и потратил некоторое время на его устранение. Если Пользователь отозвана некоторое разрешение через консоль или как-то еще, и вам это нужно в вашем приложении во время входа в систему (например, мне нужно разрешение по электронной почте) Я использую код, user2403096:
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
if (loginResult.getRecentlyDeniedPermissions().contains("email")) {
LoginManager.getInstance().logInWithReadPermissions(
this, (Collections.singletonList("email")));
} else {
performGraphRequest();
}
}
@Override
public void onCancel() {
Log.e(TAG, "LoginManager FacebookCallback onCancel");
}
@Override
public void onError(FacebookException e) {
Log.e(TAG, "LoginManager FacebookCallback onError");
}
});
performGraprhRequest() просто получает данные профиля, с GraphRequest.newMeRequest (токен, обратный вызов). Поэтому, когда вы повторно запрашиваете разрешение, будет обратный вызов в onActivityResult, но onSuccess(), onCancel() или onError() НЕ будет вызываться снова. Мой подход:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
boolean processed = mCallbackManager.onActivityResult(requestCode, resultCode, data);
if (!processed) {
performGraphRequest();
}
}
Если вы входите в Facebook и введите свои учетные данные - onActivityResult будет обработан CallbackManager и возвращает истину. CallbackManager под капотом проверяет, является ли ваш текущий AccessToken нулевым или нет, и если вы уже вошли в систему, а затем повторно запрашиваете разрешение - у вас будет токен, а callbackManager.onActivityResult возвращает false. Затем вы можете вызвать performGraphRequest и войти в свое приложение.
спасибо. Оно работает! но у меня возникли другие проблемы ... поэтому я отделил второй запрос и покажу сообщение на 1-ом завершении. – kyanro
Не работает с разрешением электронной почты. Диалоговое окно запроса не отображается, оно все равно возвращает предыдущий результат. – marino
Что делать, если второй раз лишить разрешения? Как я могу запросить еще раз? Как узнать, предоставил ли пользователь разрешение после отклонения нескольких раз? –