如何使用Firebase Auth与Facebook和Google为性别和年龄等用户设置额外的个人资料字段?

时间:2016-09-27 19:40:27

标签: android firebase firebase-authentication google-authentication facebook-authentication

在Android中进行Firebase身份验证后,如何从Facebook和Google获取性别和年龄? FirebaseUser没有照片,显示名称,电子邮件,includerid和tokenid以外的字段。

我在string.xml添加了Facebook和Google生日范围,如Firebase GitHub自述文件中所定义,但无法找出额外的字段检索。我不熟悉Android,所以我猜我做错了。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

对于Facebook:

从firebase获取facebook accessToken非常简单。我正在使用firebase auth UI。使用Facebook验证后,您将从firebase用户对象获取基本信息,如显示名称,电子邮件,提供商详细信息。但如果你想要更多的信息,如性别,生日facebook图谱API是解决方案。一旦用户通过Facebook进行身份验证,您就可以获得这样的访问令牌。

AccessToken.getCurrentAccessToken() 

但有时它会给你NULL值而不是有效的访问令牌。确保在此之前已经初始化了facebook SDK。

public class MyApplication extends Application {
  @Override
  public void onCreate() {
     super.onCreate();
     FacebookSdk.sdkInitialize(this);
  }
} After initialization use 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");
}

对于谷歌:

在您的活动中

private static final int RC_SIGN_IN = 8888;    

public void loadGoogleUserDetails() {
        try {
            // Configure sign-in to request the user's ID, email address, and basic profile. ID and
            // basic profile are included in DEFAULT_SIGN_IN.
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()
                    .build();

            // Build a GoogleApiClient with access to GoogleSignIn.API and the options above.
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                            System.out.println("onConnectionFailed");
                        }
                    })
                    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                    .build();

            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }




 @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()) {
                GoogleSignInAccount acct = result.getSignInAccount();
                // Get account information
                String PhotoUrl = acct.getPhotoUrl().toString();

            }
        }
    }