3

Я играю с Google Plus Authentication и Firebase.Firebase, Android, Google Plus Login - не удалось получить адрес электронной почты пользователя

Я сейчас использую базовый пример аутентификации с Android. Основная часть аутентификации работает отлично с кодом на github, и она работает так, как должна. https://github.com/firebase/firebase-login-demo-android

Проблема возникает, когда я пытаюсь получить адрес электронной почты, по какой-то причине она не существует в объекте authData.

Из Firebase documentation on Google authentication:

getProviderData().get("email") - The Google user's primary email address as listed on their profile. Returned only if a valid email address is available, and the Google email permission was granted by the user.

Если добавить TextView в activity_main.xml ..... .....

Тогда в моем коде MainActivity.java:

private void setAuthenticatedUser(AuthData authData) { 
    if (authData != null) { 
    /* Hide all the login buttons */ 
    ...... 
    mLoggedInStatusTextView.setVisibility(View.VISIBLE); 
    mEmailTextView = (TextView) findViewById(R.id.email_textView); 
    mEmailTextView.setText(authData.getProviderData().get("email").toString()); 
    mEmailTextView.setVisibility(View.VISIBLE); 
    ...... 
} 

Я получаю ошибку: Попытка вызова виртуального метода 'java.lang.String ja va.lang.Object.toString() 'по ссылке нулевого объекта

Кроме того, в Android Studion с отладкой, когда я просматриваю объект authData, адрес электронной почты не задан, а другие значения - auth, provider, providerData, токен, uid, expires и т. д.

Все, кажется, работает отлично, за исключением получения адреса электронной почты. Я не уверен, нужны ли дополнительные разрешения. В моем файле AndroidManifest.xml У меня есть следующие:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

Из того, что я прочитал, разрешение GET_ACCOUNTS должно быть достаточно. Любые идеи о том, почему Firebase, похоже, не могут его получить?

EDIT: Кроме того, я могу сохранить свои пользовательские данные Firebase https://www.firebase.com/docs/android/guide/user-auth.html#section-storing

if(authData.getProviderData().containsKey("email")) { 
    map.put("displayName", authData.getProviderData().get("email").toString()); 
} 

Затем это значение по электронной почте всегда пусто, так что это не получение электронной почты от Google Plus на всех.

ответ

1

Похоже, вам нужно запросить дополнительную область, включающую электронную почту. Если вы добавите эту область, вы сможете получить доступ к электронной почте с помощью getProviderData().

Почему

Google+ Sign-in for Android запрашивает стандартный набор областей. По умолчанию этот набор не включает адрес электронной почты.

Как

Области действия определяются при инициализации GoogleApiClient, как описано here. Укажите область электронной почты.

mGoogleApiClient = new GoogleApiClient.Builder(this) 
    .addConnectionCallbacks(this) 
    .addOnConnectionFailedListener(this) 
    .addApi(Plus.API) 
    .addScope(Plus.SCOPE_PLUS_LOGIN) 
    .addScope("email") // <-- This requests the email address 
    .build(); 

Документы также содержат список широко используемых Google+ Sign-In scopes.

0

Вы можете использовать другой метод, отличный от getProviderData().get("email"), чтобы получить электронное письмо от пользователя.

String email = Plus.AccountApi.getAccountName(mGoogleApiClient); 

Это должно быть электронным адресом пользователя. <uses-permission android:name="android.permission.GET_ACCOUNTS" /> достаточно для разрешения, поэтому вам не нужно добавлять какие-либо разрешения или область действия.

1

Я столкнулся с этой проблемой на этой неделе. Даже добавив необходимые области, я все еще не мог получить доступ к электронной почте пользователя. Обратный вызов authData всегда имел те же поля независимо от того, какую область я добавил.

Я пробовал .addScope(new Scope("email")) и .addScope(new Scope("https://www.googleapis.com/auth/plus.profile.emails.read")), но ничего не добился.

Единственный способ, которым мне удалось получить электронное письмо пользователя, было использование метода Google onConnected и запрос по электронной почте пользователя.

if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { 
     String email = Plus.AccountApi.getAccountName(mGoogleApiClient); 
     Log.i("email", email); 
    } 
+0

Благодарим за это. Это в значительной степени то, что я сделал в конце. Я не уверен в последствиях производительности, делая другой звонок, но он работает по крайней мере сейчас. – Chris

0

Вы можете получить электронную почту пользователя от объекта Plus, как это:

if (mGoogleApiClient.isConnected()) { 
    String email = Plus.AccountApi.getAccountName(mGoogleApiClient); 
} 
0

Вы можете получить Firebase пользователя по электронной почте с помощью Firebase Auth службы.

FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       String email = user.getEmail(); 
      } 
     } 
    }; 
Смежные вопросы