Facebook android sdk - пользователь электронной почты возвращает ноль
У меня есть следующий код, который регистрирует пользователя на Facebook через мое приложение. Я получаю user.getproperty("электронная почта") как ноль в первый раз. когда я запускаю приложение во второй раз, я получаю значение. ниже мой код.
private void loginToFb () {
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
LandingPageActivity.this, Arrays.asList(
"user_location", "user_birthday",
"user_likes", "email"));
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
session.requestNewReadPermissions(newPermissionsRequest);
// make request to the /me API
Request request = Request.newMeRequest(session,
new Request.GraphUserCallback() {
// callback after Graph API response with user
// object
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
fetchUserFbDetails(user);
}
}
});
Request.executeBatchAsync(request);
}
}
});
}
3 ответа
Проблема в том, что вы запрашиваете новые разрешения ВНУТРИ обратного вызова состояния, но затем вы делаете meRequest немедленно, до того, как новый запрос на разрешения завершается (все разрешения и запросы на открытие сеанса являются асинхронными).
Поскольку вы запрашиваете только разрешения на чтение, нет необходимости делать отдельный запрос на разрешение, вы можете сделать все это за один раз. Что-то вроде:
Session.OpenRequest openRequest = new Session.OpenRequest(LandingPageActivity.this);
openRequest.setPermissions(Arrays.asList...);
openRequest.setCallback(new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request request = Request.newMeRequest(session,
new Request.GraphUserCallback() {
// callback after Graph API response with user
// object
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
fetchUserFbDetails(user);
}
}
});
request.executeAsync();
}
});
Session session = new Session(LandingPageActivity.this);
Session.setActiveSession(session);
session.openForRead(openRequest);
Вместо того, чтобы управлять сессиями самостоятельно, вы должны использовать Facebook LoginButton
и UiLifecycleHelper
,
1) Объявите кнопку входа в вашем пользовательском интерфейсе:
<!-- FACEBOOK LOGIN -->
<com.facebook.widget.LoginButton
android:id="@+id/facebookLoginBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true" />
2) Создать LoginFragment
и объявить закрытым членом:
private UiLifecycleHelper mFacebookLifecycleHelper;
3) Во фрагменте onCreate()
метод, инициализируйте LoginButton и добавьте хук, чтобы получить информацию о пользователе:
LoginButton facebookLoginButton = (LoginButton) view.findViewById(R.id.facebookLoginBtn);
facebookLoginButton.setFragment(this);
// Intercept the facebook user returned from login
facebookLoginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
@Override
public void onUserInfoFetched(GraphUser user) {
mFacebookUser = user;
if (user != null) {
LogUtils.LOGFB(TAG, "Got a Facebook user: " + user.getFirstName() +
" " + user.getLastName() + ", email: " + user.getProperty("email"));
}
else {
LogUtils.LOGFB(TAG, "No Facebook user");
}
}
});
// Set extra read permissions
facebookLoginButton.setReadPermissions(Arrays.asList(
"email", "user_birthday", ...));
4) Создать обратный вызов для прослушивания изменений состояния сеанса Facebook:
// Listen for changes in Facebook session state
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
// Respond to Facebook session state changes
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
LogUtils.LOGFB(TAG, "Logged in using facebook");
LogUtils.LOGFB(TAG, "Access Token: " + session.getAccessToken());
// TODO: display authenticated UI
} else if (state.isClosed()) {
LogUtils.LOGFB(TAG, "Logged out from facebook");
// TODO: display the non-authenticated UI
}
}
5) Затем убедитесь, что вы вызываете lifecycleHelper для всех изменений жизненного цикла вашего фрагмента:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Creates the Facebook session and opens it automatically if a cached token is available.
mFacebookLifecycleHelper = new UiLifecycleHelper(getActivity(), callback);
mFacebookLifecycleHelper.onCreate(savedInstanceState);
...
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFacebookLifecycleHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onResume() {
super.onResume();
mFacebookLifecycleHelper.onResume();
}
@Override
public void onPause() {
super.onPause();
mFacebookLifecycleHelper.onPause();
}
@Override
public void onDestroy() {
mFacebookLifecycleHelper.onDestroy();
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mFacebookLifecycleHelper.onSaveInstanceState(outState);
}
Попробуйте этот код.
String email = user.getProperty("email").toString();
String safeEmail = user.asMap().get("email").toString();