2016-08-31 6 views

Antwort

2

Leider Firebase hat keine integrierte Funktionalität um das Geschlecht/Geburtsdatum des Benutzers nach erfolgreicher Anmeldung zu erhalten. Sie müssten diese Daten von jedem der Provider selbst abrufen.

Hier ist, wie Sie vielleicht den Benutzer Geschlecht von Google bekommen mit Google People API

public class SignInActivity extends AppCompatActivity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     View.OnClickListener { 
    private static final int RC_SIGN_IN = 9001; 

    private GoogleApiClient mGoogleApiClient; 

    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_google_sign_in); 

     // We can only get basic information using FirebaseAuth 
     mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in to Firebase, but we can only get 
        // basic info like name, email, and profile photo url 
        String name = user.getDisplayName(); 
        String email = user.getEmail(); 
        Uri photoUrl = user.getPhotoUrl(); 

        // Even a user's provider-specific profile information 
        // only reveals basic information 
        for (UserInfo profile : user.getProviderData()) { 
         // Id of the provider (ex: google.com) 
         String providerId = profile.getProviderId(); 
         // UID specific to the provider 
         String profileUid = profile.getUid(); 
         // Name, email address, and profile photo Url 
         String profileDisplayName = profile.getDisplayName(); 
         String profileEmail = profile.getEmail(); 
         Uri profilePhotoUrl = profile.getPhotoUrl(); 
        } 
       } else { 
        // User is signed out of Firebase 
       } 
      } 
     }; 

     // Google sign-in button listener 
     findViewById(R.id.google_sign_in_button).setOnClickListener(this); 

     // Configure GoogleSignInOptions 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.server_client_id)) 
       .requestServerAuthCode(getString(R.string.server_client_id)) 
       .requestEmail() 
       .requestScopes(new Scope(PeopleScopes.USERINFO_PROFILE)) 
       .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, this) 
       .addOnConnectionFailedListener(this) 
       .addConnectionCallbacks(this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.google_sign_in_button: 
       signIn(); 
       break; 
     } 
    } 

    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()) { 
       // Signed in successfully 
       GoogleSignInAccount acct = result.getSignInAccount(); 

       // execute AsyncTask to get gender from Google People API 
       new GetGendersTask().execute(acct); 

       // Google Sign In was successful, authenticate with Firebase 
       firebaseAuthWithGoogle(acct); 
      } 
     } 
    } 

    class GetGendersTask extends AsyncTask<GoogleSignInAccount, Void, List<Gender>> { 
     @Override 
     protected List<Gender> doInBackground(GoogleSignInAccount... googleSignInAccounts) { 
      List<Gender> genderList = new ArrayList<>(); 
      try { 
       HttpTransport httpTransport = new NetHttpTransport(); 
       JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

       //Redirect URL for web based applications. 
       // Can be empty too. 
       String redirectUrl = "urn:ietf:wg:oauth:2.0:oob"; 

       // Exchange auth code for access token 
       GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
         httpTransport, 
         jsonFactory, 
         getApplicationContext().getString(R.string.server_client_id), 
         getApplicationContext().getString(R.string.server_client_secret), 
         googleSignInAccounts[0].getServerAuthCode(), 
         redirectUrl 
       ).execute(); 

       GoogleCredential credential = new GoogleCredential.Builder() 
         .setClientSecrets(
          getApplicationContext().getString(R.string.server_client_id), 
          getApplicationContext().getString(R.string.server_client_secret) 
         ) 
         .setTransport(httpTransport) 
         .setJsonFactory(jsonFactory) 
         .build(); 

       credential.setFromTokenResponse(tokenResponse); 

       People peopleService = new People.Builder(httpTransport, jsonFactory, credential) 
         .setApplicationName("My Application Name") 
         .build(); 

       // Get the user's profile 
       Person profile = peopleService.people().get("people/me").execute(); 
       genderList.addAll(profile.getGenders()); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return genderList; 
     } 

     @Override 
     protected void onPostExecute(List<Gender> genders) { 
      super.onPostExecute(genders); 
      // iterate through the list of Genders to 
      // get the gender value (male, female, other) 
      for (Gender gender : genders) { 
       String genderValue = gender.getValue(); 
      } 
     } 
    } 
} 

können Sie weitere Informationen finden Sie auf Accessing Google APIs

1

Nein, Sie können diese Daten nicht direkt erhalten. Sie können jedoch die ID des Benutzers verwenden und diese Daten von verschiedenen Anbietern abrufen. Bitte überprüfen Sie vorher, welche Daten in der öffentlichen API für jeden dieser Anbieter verfügbar sind. Google hat zum Beispiel nur wenige Methoden aus peopleApi abgelehnt.

Sowieso hier ist, was ich für Facebook tun

// Initialize Firebase Auth 
FirebaseAuth mAuth = FirebaseAuth.getInstance(); 

// Create a listener 
FirebaseAuth.AuthStateListener mAuthListener = firebaseAuth -> { 
     FirebaseUser user = firebaseAuth.getCurrentUser(); 
     if (user != null) { 
      // User is signed in 
      Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
     } else { 
      // User is signed out 
      Log.d(TAG, "onAuthStateChanged:signed_out"); 
     } 

     if (user != null) { 
      Log.d(TAG, "User details : " + user.getDisplayName() + user.getEmail() + "\n" + user.getPhotoUrl() + "\n" 
        + user.getUid() + "\n" + user.getToken(true) + "\n" + user.getProviderId()); 

      String userId = user.getUid(); 
      String displayName = user.getDisplayName(); 
      String photoUrl = String.valueOf(user.getPhotoUrl()); 
      String email = user.getEmail(); 

      Intent homeIntent = new Intent(LoginActivity.this, HomeActivity.class); 
      startActivity(homeIntent); 
      finish(); 
     } 
    }; 

//Initialize the fB callbackManager 
mCallbackManager = CallbackManager.Factory.create(); 

Und im Inneren des onClick des FB Login-Button folgendes tun

LoginManager.getInstance().registerCallback(mCallbackManager, 
      new FacebookCallback<LoginResult>() { 
       @Override 
       public void onSuccess(LoginResult loginResult) { 
        Log.d(TAG, "facebook:onSuccess:" + loginResult); 
        handleFacebookAccessToken(loginResult.getAccessToken()); 
       } 

       @Override 
       public void onCancel() { 
        Log.d(TAG, "facebook:onCancel"); 
       } 

       @Override 
       public void onError(FacebookException error) { 
        Log.d(TAG, "facebook:onError", error); 
       } 
      }); 

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email")); 
+1

Ich kann nicht in Ihrer Proben sehen, wo Sie das Geschlecht oder das Geburtsdatum bekommen? –

+0

Diese sind nicht meine Firebase dafür, dass Sie die Grafik-API von Facebook und die UID verwenden müssen, die Sie hier für verschiedene Anfragen an die Grafik-API erhalten. https://developers.facebook.com/docs/graph-api –

+0

Ich sehe, so kann es nicht mit der Firebase SDK getan werden. Ich muss die Graph API oder People API einzeln verwenden, um sie zu bekommen –

1

Für Facebook:

zu Facebook accessToken bekommen von Feuerbasis ist sehr einfach. Ich habe Firebase Auth UI verwendet. Nach der Authentifizierung mit Facebook erhalten Sie grundlegende Informationen von Firebase-Benutzerobjekt wie Anzeigename, E-Mail, Provider-Details. Aber wenn Sie mehr Informationen wie Geschlecht möchten, Geburtstag facebook Graph API ist die Lösung. Sobald der Benutzer sich mit Facebook authentifiziert hat, können Sie ein solches Token erhalten.

AccessToken.getCurrentAccessToken() Aber manchmal gibt es Ihnen NULL-Wert anstelle von gültigem Zugriffstoken. Stellen Sie sicher, dass Sie das Facebook SDK zuvor initialisiert haben.

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    FacebookSdk.sdkInitialize(this); 
    } 

} Nach der Initialisierung Verwendung graphAPI

if(AccessToken.getCurrentAccessToken()!=null) { 

    System.out.println(AccessToken.getCurrentAccessToken().getToken()); 

    GraphRequest request = GraphRequest.newMeRequest(
      AccessToken.getCurrentAccessToken(), 
      new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject object, GraphResponse response) { 
        // Application code 
        try { 
         String email = object.getString("email"); 
         String gender = object.getString("gender"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "id,name,email,gender,birthday"); 
    request.setParameters(parameters); 
    request.executeAsync(); 

} 
else 
{ 
    System.out.println("Access Token NULL"); 
} 

Glücklich Coding :)

Verwandte Themen