【问题标题】:Android Facebook 4.0 SDK How to get Email, Date of Birth and gender of UserAndroid Facebook 4.0 SDK 如何获取用户的电子邮件、出生日期和性别
【发布时间】:2015-03-27 08:12:31
【问题描述】:

我正在使用以下代码。我想要用户的出生日期、电子邮件和性别。请帮忙。如何检索这些数据?

这是我在 Fragment 中的onViewCreated()

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    // Setup TextView.
    mTextDetails = (TextView) view.findViewById(R.id.text_details);

    // Set up Login Button.
    LoginButton mButtonLogin = (LoginButton) view.findViewById(R.id.login_button);
    // setFragment only if you are using it inside a Fragment.
    mButtonLogin.setFragment(this);
    mButtonLogin.setReadPermissions("user_friends");
    mButtonLogin.setReadPermissions("public_profile");
    mButtonLogin.setReadPermissions("email");
    mButtonLogin.setReadPermissions("user_birthday");

    // Register a callback method when Login Button is Clicked.
    mButtonLogin.registerCallback(mCallbackManager, mFacebookCallback);

}

这是我的回调方法。

private FacebookCallback<LoginResult> mFacebookCallback = new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        Log.d("Shreks Fragment", "onSuccess");


        Profile profile = Profile.getCurrentProfile();
        Log.d("Shreks Fragment onSuccess", "" +profile);

        // Get User Name
        mTextDetails.setText(profile.getName() + "");

    }


    @Override
    public void onCancel() {
        Log.d("Shreks Fragmnt", "onCancel");
    }

    @Override
    public void onError(FacebookException e) {
        Log.d("Shreks Fragment", "onError " + e);
    }
};

【问题讨论】:

标签: android facebook-android-sdk facebook-sdk-4.0


【解决方案1】:

这不是设置权限的正确方法,因为您正在用每个方法调用覆盖它们。

替换这个:

mButtonLogin.setReadPermissions("user_friends");
mButtonLogin.setReadPermissions("public_profile");
mButtonLogin.setReadPermissions("email");
mButtonLogin.setReadPermissions("user_birthday");

如下,setReadPermissions() 方法接受一个 ArrayList:

loginButton.setReadPermissions(Arrays.asList(
        "public_profile", "email", "user_birthday", "user_friends"));

另外这里是查询额外数据GraphRequest的方法:

private LoginButton loginButton;
private CallbackManager callbackManager;

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

    loginButton = (LoginButton) findViewById(R.id.login_button);

    loginButton.setReadPermissions(Arrays.asList(
            "public_profile", "email", "user_birthday", "user_friends"));

    callbackManager = CallbackManager.Factory.create();

    // Callback registration
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            // App code
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            Log.v("LoginActivity", response.toString());

                            // Application code
                            String email = object.getString("email");
                            String birthday = object.getString("birthday"); // 01/31/1980 format
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender,birthday");
            request.setParameters(parameters);
            request.executeAsync();


        }

        @Override
        public void onCancel() {
            // App code
            Log.v("LoginActivity", "cancel");
        }

        @Override
        public void onError(FacebookException exception) {
            // App code
            Log.v("LoginActivity", exception.getCause().toString());
        }
    });
}

编辑:

一个可能的问题是 Facebook 假定您的电子邮件无效。要对其进行测试,请使用Graph API Explorer 并尝试获取它。如果即使在那里您也无法收到您的电子邮件,请在您的个人资料设置中更改它,然后重试。对于一些评论我的答案的开发人员来说,这种方法解决了这个问题。

【讨论】:

  • 嘿 @Schwertfisch 你能展示如何使用 object.getString("email"); ,对我很有帮助:)
  • 为什么我已经设置了loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));,但仍收到“电子邮件没有价值”错误?
  • @Schwertfisch 在我的情况下,即使使用 Graph API Explorer 也无法收到我的电子邮件,所以我在我的帐户中添加了一个替代电子邮件并且它有效,也许您的电子邮件无效。
  • @DevendraSingh 你得到了值并将它们放在一个额外的 Intent myIntent = new Intent(this, SecondActivity.class);myIntent.putExtra("email", object.getString("email "));..... 在第二个活动 Bundle extras = getIntent().getExtras(); if(extras != null){ email = extras.getString("email"); } 你也可以有一个静态变量并赋值。对不起我的英语不好。不知道这是不是你想要的答案
  • 我只想说 Facebook Docs 太差了!很遗憾,我们需要在这里找到如何做到这一点。
【解决方案2】:

使用这个 sn-p 获取所有配置文件信息

private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();
            Profile profile = Profile.getCurrentProfile();

            // Facebook Email address
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) {
                            Log.v("LoginActivity Response ", response.toString());

                            try {
                                Name = object.getString("name");

                                FEmail = object.getString("email");
                                Log.v("Email = ", " " + FEmail);
                                Toast.makeText(getApplicationContext(), "Name " + Name, Toast.LENGTH_LONG).show();


                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender, birthday");
            request.setParameters(parameters);
            request.executeAsync();


        }

        @Override
        public void onCancel() {
            LoginManager.getInstance().logOut();

        }

        @Override
        public void onError(FacebookException e) {

        }
    };

【讨论】:

    【解决方案3】:

    您不会在onSuccess() 中获得 Profile,您需要实现 ProfileTracker 以及注册回调

    mProfileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) {
            // Fetch user details from New Profile
        }
    };
    

    另外不要忘记处理profile tracker的开始和停止

    现在您将拥有一个可以从中获取 AccessToken 的配置文件(解决了空配置文件的问题)。您只需使用“https://developers.facebook.com/docs/android/graph#userdata”即可获取任何数据。

    【讨论】:

    • 但是获取电子邮件地址和性别的语法是什么?你能告诉我吗
    • 我将其作为访问令牌获取:{AccessToken token:ACCESS_TOKEN_REMOVED 权限:[user_friends, email, user_birthday, basic_info]} 我在 FacebookCallBack 下使用此代码 ---- AccessToken mAccessToken = loginResult。获取访问令牌();你能告诉我这是什么意思吗?以及如何解决此错误并获取访问令牌?
    • @SriyankSiddhartha 你有什么解决方案吗?你能在这里更新吗,面临同样的问题
    • @Sriyank,我也面临同样的问题,无法获取电子邮件 ID。如果您找到任何解决方案,请帮助我。提前致谢。
    • 我仍然找不到任何解决方案...我目前仍在使用旧的 sdk..如果您得到解决方案请告诉我..谢谢
    【解决方案4】:

    登录后

    private void getFbInfo() {
        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        try {
                            Log.d(LOG_TAG, "fb json object: " + object);
                            Log.d(LOG_TAG, "fb graph response: " + response);
    
                            String id = object.getString("id");
                            String first_name = object.getString("first_name");
                            String last_name = object.getString("last_name");
                            String gender = object.getString("gender");
                            String birthday = object.getString("birthday");
                            String image_url = "http://graph.facebook.com/" + id + "/picture?type=large";
    
                            String email;
                            if (object.has("email")) {
                                email = object.getString("email");
                            }
    
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,first_name,last_name,email,gender,birthday"); // id,first_name,last_name,email,gender,birthday,cover,picture.type(large)
        request.setParameters(parameters);
        request.executeAsync();
    }
    

    【讨论】:

      【解决方案5】:

      以下是查找电子邮件 ID、姓名和个人资料网址等的代码

          private CallbackManager callbackManager;
      
          protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_sign_in);
      //TODO on click of fb custom button call handleFBLogin()
           callbackManager = CallbackManager.Factory.create();
          }
      
          private void handleFBLogin() {
                  AccessToken accessToken = AccessToken.getCurrentAccessToken();
                  boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
      
                  if (isLoggedIn && Store.isUserExists(ActivitySignIn.this)) {
                      goToHome();
                      return;
                  }
      
                  LoginManager.getInstance().logInWithReadPermissions(ActivitySignIn.this, Arrays.asList("public_profile", "email"));
                  LoginManager.getInstance().registerCallback(callbackManager,
                          new FacebookCallback<LoginResult>() {
                              @Override
                              public void onSuccess(final LoginResult loginResult) {
                                  runOnUiThread(new Runnable() {
                                      @Override
                                      public void run() {
                                          setFacebookData(loginResult);
                                      }
                                  });
                              }
      
                              @Override
                              public void onCancel() {
                                  Toast.makeText(ActivitySignIn.this, "CANCELED", Toast.LENGTH_SHORT).show();
                              }
      
                              @Override
                              public void onError(FacebookException exception) {
                                  Toast.makeText(ActivitySignIn.this, "ERROR" + exception.toString(), Toast.LENGTH_SHORT).show();
                              }
                          });
              }
      
      private void setFacebookData(final LoginResult loginResult) {
              GraphRequest request = GraphRequest.newMeRequest(
                      loginResult.getAccessToken(),
                      new GraphRequest.GraphJSONObjectCallback() {
                          @Override
                          public void onCompleted(JSONObject object, GraphResponse response) {
                              // Application code
                              try {
                                  Log.i("Response", response.toString());
      
                                  String email = response.getJSONObject().getString("email");
                                  String firstName = response.getJSONObject().getString("first_name");
                                  String lastName = response.getJSONObject().getString("last_name");
                                  String profileURL = "";
                                  if (Profile.getCurrentProfile() != null) {
                                      profileURL = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), 400, 400).toString();
                                  }
      
                                 //TODO put your code here
                              } catch (JSONException e) {
                                  Toast.makeText(ActivitySignIn.this, R.string.error_occurred_try_again, Toast.LENGTH_SHORT).show();
                              }
                          }
                      });
              Bundle parameters = new Bundle();
              parameters.putString("fields", "id,email,first_name,last_name");
              request.setParameters(parameters);
              request.executeAsync();
          }
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                  callbackManager.onActivityResult(requestCode, resultCode, data);
          }
      

      【讨论】:

        【解决方案6】:

        这是一个可行的解决方案(2019 年): 将此代码放入您的登录逻辑中;

         GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject json, GraphResponse response) {
                            // Application code
                            if (response.getError() != null) {
                                System.out.println("ERROR");
                            } else {
                                System.out.println("Success");
                                String jsonresult = String.valueOf(json);
                                System.out.println("JSON Result" + jsonresult);
        
                                String fbUserId = json.optString("id");
                                String fbUserFirstName = json.optString("name");
                                String fbUserEmail = json.optString("email");
                                //String fbUserProfilePics = "http://graph.facebook.com/" + fbUserId + "/picture?type=large";
                                Log.d("SignUpActivity", "Email: " + fbUserEmail + "\nName: " + fbUserFirstName + "\nID: " + fbUserId);
                            }
                            Log.d("SignUpActivity", response.toString());
                        }
                    });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,email,gender, birthday");
                    request.setParameters(parameters);
                    request.executeAsync();
                }
        
                @Override
                public void onCancel() {
                    setResult(RESULT_CANCELED);
                    Toast.makeText(SignUpActivity.this, "Login Attempt Cancelled", Toast.LENGTH_SHORT).show();
                }
        
                @Override
                public void onError(FacebookException error) {
                    Toast.makeText(SignUpActivity.this, "An Error Occurred", Toast.LENGTH_LONG).show();
                    error.printStackTrace();
                }
            });
        

        【讨论】:

        • 那里有什么 json ??
        【解决方案7】:

        您可以使用 GraphRequest 类调用 Facebook Graph API 来获取用户信息。请参阅https://developers.facebook.com/docs/android/graph 了解更多信息。

        【讨论】:

          【解决方案8】:

          这对我有用,希望对某人有所帮助(使用我自己的按钮而不是 FB 登录按钮)

          CallbackManager callbackManager;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              FacebookSdk.sdkInitialize(getApplicationContext());
              setContentView(R.layout.activity_sign_in_user);
          
          
          
               LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                  @Override
                  public void onSuccess(LoginResult loginResult) {
          
          
                      GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                          @Override
                          public void onCompleted(JSONObject object, GraphResponse response) {
                              try {
                                  Log.i("RESAULTS : ", object.getString("email"));
                              }catch (Exception e){
          
                              }
                          }
                      });
                      Bundle parameters = new Bundle();
                      parameters.putString("fields", "email");
                      request.setParameters(parameters);
                      request.executeAsync();
          
                  }
          
                  @Override
                  public void onCancel() {
          
                  }
          
                  @Override
                  public void onError(FacebookException error) {
                      Log.i("RESAULTS : ", error.getMessage());
                  }
              });
          
          
          }
          
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              callbackManager.onActivityResult(requestCode, resultCode, data);
              super.onActivityResult(requestCode, resultCode, data);
          }
          
          
          boolean isEmailValid(CharSequence email) {
              return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
          }
          
          public void signupwith_facebook(View view) {
          
              LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile","email"));
          }
          }
          

          【讨论】:

            【解决方案9】:

            在点击按钮上添加这一行

            loginButton.setReadPermissions(Arrays.asList( “public_profile”、“email”、“user_birthday”、“user_friends”));

            【讨论】:

              【解决方案10】:

              使用 Profile 类的 FB 静态方法 getCurrentProfile() 来检索这些信息。

               Profile profile = Profile.getCurrentProfile();
               String firstName = profile.getFirstName());
               System.out.println(profile.getProfilePictureUri(20,20));
               System.out.println(profile.getLinkUri());
              

              【讨论】:

              • 问题是关于电子邮件、生日和性别的。这没有回答任何问题。
              • 这不给电子邮件
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-30
              相关资源
              最近更新 更多