3

Google Plus 인증 및 Firebase를 사용 중입니다.Firebase, Android, Google Plus 로그인 - 사용자의 이메일 주소를 가져올 수 없음

현재 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.

내가 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를 호출하려고 시도했습니다. null 개체 참조에 대해 'va.lang.Object.toString()'

또한 디버그가 켜져있는 상태에서 authData 개체를 살펴볼 때 전자 메일은 설정되지 않지만 다른 값은 - auth, provider, providerData, token, uid, expires 등 ...

이메일 주소를 가져 오는 것 외에는 모든 것이 잘 작동하는 것처럼 보입니다. addiontial 권한이 필요한지 확실하지 않습니다.

내가 읽은 바로는
<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 권한이 충분히 있어야한다 : 내의 AndroidManifest.xml 파일에서 나는 다음 있습니다. Firebase가 왜 가져올 수 없는지에 대한 아이디어가 있습니까?

편집 : 또한, 나는

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

https://www.firebase.com/docs/android/guide/user-auth.html#section-storing 다음이 이메일 값은 항상 비어 중포 기지 내 사용자 데이터를 저장할 수 있어요, 그래서 모든 구글 플러스에서 이메일을 검색 아니에요.

답변

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

이 같은 플러스 오브젝트에서 사용자의 이메일을받을 수 있습니다

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

당신은 중포 기지 인증 서비스에서 중포 기지 사용자 이메일을 가져올 수 있습니다.

FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       String email = user.getEmail(); 
      } 
     } 
    };