2016-06-13 6 views
0

Ich registriere Benutzer mit Google in meiner App und dann bin ich dort FotoUrl, E-Mail abrufen und Anzeigename.profile.getEmail() Abrufen von zwei Zeichenfolge - eine E-Mail und eine andere leere

Das Problem ist, dass die profile.getEmail(); zwei Zeichenfolgen zurückgibt/abruft. Einer ist E-Mail und ein anderer ist leer.

Hier ist, wie ich die Anmeldung ihnen:

public class SignupActivity extends AppCompatActivity { 

    private static final int RC_SIGN_IN = 1; 
    GoogleApiClient mGoogleApiClient; 
    FirebaseAuth mAuth; 
    TextView appName; 
    ProgressDialog signinProgressDialog; 
    CoordinatorLayout coordinatorLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_signup); 
//  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
//  setSupportActionBar(toolbar); 

     signinProgressDialog = new ProgressDialog(SignupActivity.this); 

     coordinatorLayout = (CoordinatorLayout) findViewById(R.id.signupCoordinatorLayout); 

     // Configure Google Sign In 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.o_auth_client_id)) 
       .requestEmail() 
       .requestProfile() 
       .requestId() 
       .build(); 

     // Build a GoogleApiClient with access to the Google Sign-In API and the 
     // options specified by gso. 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

        } 
       } /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     mAuth = FirebaseAuth.getInstance(); 

     findViewById(R.id.sign_in_button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (isNetworkAvailable()) { 
        signinProgressDialog.setMessage("Signing in..."); 
        signinProgressDialog.show(); 
        signIn(); 
       } else { 
        Snackbar snackbar = Snackbar 
          .make(coordinatorLayout, "No internet connection!", Snackbar.LENGTH_LONG); 
        snackbar.show(); 
        signinProgressDialog.dismiss(); 
       } 
      } 
     }); 

    } 

    private void signIn() { 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       // Google Sign In was successful, authenticate with Firebase 
       GoogleSignInAccount account = result.getSignInAccount(); 
       firebaseAuthWithGoogle(account); 
      } else { 
       // Google Sign In failed, update UI appropriately 
       // ... 
      } 
     } 
    } 

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
     Log.d("firebaseAuthWithGoogle", "firebaseAuthWithGoogle:" + acct.getId()); 

     AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
     mAuth.signInWithCredential(credential) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d("signin_successful", "signInWithCredential:onComplete:" + task.isSuccessful()); 

         Intent mainActivityIntent = new Intent(SignupActivity.this, MainActivity.class); 
         mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
         startActivity(mainActivityIntent); 
         signinProgressDialog.dismiss(); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          Log.w("signin_unsuccessful", "signInWithCredential", task.getException()); 
          Toast.makeText(SignupActivity.this, "Authentication failed.", 
            Toast.LENGTH_SHORT).show(); 
         } 
         // ... 
        } 
       }); 
    } 

    @Override 
    public void onBackPressed() { 
     finish(); 
     super.onBackPressed(); 
    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) SignupActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 
} 

Hier ist, wie ich das Wesentliche bin Abrufen:

public void retrieveUserInfo() { 
     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     if (user != null) { 
      for (UserInfo profile : user.getProviderData()) { 

       // Id of the provider (ex: google.com) 
       providerId = profile.getProviderId(); 

       // UID specific to the provider 
       uid = profile.getUid(); 

       // Name, email address, and profile photo Url 
       name = profile.getDisplayName(); 
       email = profile.getEmail(); 
       photoUrl = profile.getPhotoUrl().toString(); 

      } 
     } 
    } 

Hier wird, wenn ich die E-Mail-String in einem Toast platziert, bekam ich 2 Toasts, der erste zeigte die E-Mail und der zweite war leer.

Ich weiß wirklich nicht, was hier falsch ist.

Bitte lassen Sie es mich wissen.

Sorry, wenn die Frage scheint falsch formatiert zu sein. Ich bin noch ein Anfänger hier.

+0

Meinten Sie Feuerbasis ein String-Array zurückgibt? Wie erklärst du E-Mails? Hast du versucht es zu debuggen? – adolfosrs

Antwort

1

Ändern der Code in retrieveUserInfo() hat den Job gemacht.

Hier ist der veränderte Code:

public void retrieveUserInfo() { 
     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     if (user != null) { 
      // Id of the provider (ex: google.com) 
      providerId = user.getProviderId(); 

      // UID specific to the provider 
      uid = user.getUid(); 

      // Name, email address, and profile photo Url 
      name = user.getDisplayName(); 
      email = user.getEmail(); 
      photoUrl = user.getPhotoUrl().toString(); 

     } 
    } 
1

Sie verwenden for() Schleife vielleicht verursacht das Problem, sobald es die Zeichenfolge und andere Zeit nicht bekommt.

+0

removing for loop hat den Job für mich erledigt. –