SDK Android Facebook 4.0 Cách nhận email, ngày sinh và giới tính của người dùng


144

Tôi đang sử dụng mã sau đây. Tôi muốn Ngày sinh, Email và Giới tính của người dùng. Xin vui lòng giúp đỡ. Làm thế nào để lấy lại những dữ liệu đó?

Đây là phần onViewCreated()bên trong của tôi .

@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);

}

Đây là Phương thức gọi lại của tôi.

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);
    }
};


Xin chào, @Sriyank hãy giúp tôi nếu bạn giải quyết được vấn đề của mình. Tôi muốn lấy thông tin người dùng từ đoạn đăng nhập facebook sau khi đăng nhập hoàn tất muốn đi hoạt động tiếp theo xin vui lòng cho tôi biết làm thế nào tôi có thể làm điều đó?
Devendra Singh

giải pháp bên dưới nhưng hãy cẩn thận vì email có thể trống nếu người dùng đăng nhập qua số điện thoại của anh ấy Truy cập stackoverflow.com/questions/29517667/ và và stackoverflow.com/questions/29493486/
Thẻ

Câu trả lời:


335

Đó không phải là cách đúng để đặt quyền khi bạn ghi đè chúng với mỗi lệnh gọi phương thức.

Thay thế này:

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

Với cách sau, vì phương thức setReadPermissions()chấp nhận ArrayList:

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

Ngoài ra đây là cách truy vấn dữ liệu bổ sung 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());
        }
    });
}

BIÊN TẬP:

Một vấn đề có thể xảy ra là Facebook cho rằng email của bạn không hợp lệ. Để kiểm tra nó, hãy sử dụng Graph API Explorer và thử lấy nó. Nếu thậm chí ở đó bạn không thể nhận được email của mình, hãy thay đổi nó trong cài đặt hồ sơ của bạn và thử lại. Cách tiếp cận này đã giải quyết vấn đề này cho một số nhà phát triển bình luận câu trả lời của tôi.


2
Xin chào @Schwertfisch, bạn có thể chỉ cho bạn cách sử dụng object.getString ("email"); , nó sẽ rất hữu ích cho tôi :)
Ajeet

3
Tại sao tôi nhận được lỗi "Không có giá trị cho email" mặc dù tôi đã đặt loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
stackex

1
@Schwertfisch trong trường hợp của tôi, tôi không thể nhận được email của mình ngay cả khi sử dụng Graph API Explorer, vì vậy tôi đã thêm một email thay thế vào tài khoản của mình và nó đã hoạt động, có thể email của bạn không hợp lệ.
Kayan Almeida

1
@DevendraSingh bạn có yo nhận các giá trị và đặt chúng vào một bổ sung, Intent myIntent = new Intent (this, SecondActivity. Class); myIntent.putExtra ("email", object.getString ("email")); .... Trong hoạt động thứ hai Gói bổ sung = getIntent (). GetExtras (); if (ngoại tuyến! = null) {email = ngoại tuyến.getString ("email"); } Ngoài ra, bạn có thể có một biến tĩnh và gán giá trị. Xin lỗi vì tiếng Anh của tôi. Tôi không biết đây có phải là câu trả lời mà bạn muốn không
schwertfisch

85
Tôi chỉ cần nói rằng Facebook Docs rất nghèo! thật là xấu hổ chúng ta cần tìm ra cách để làm điều đó ở đây.
Gal Rom

13

Sử dụng đoạn mã này để có được tất cả thông tin hồ sơ

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) {

        }
    };

12

Bạn sẽ không nhận được Hồ sơ onSuccess()mà bạn cần triển khai ProfileTrackercùng với đăng ký gọi lại

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

Cũng đừng quên xử lý bắt đầu và dừng theo dõi hồ sơ

Bây giờ bạn sẽ có một hồ sơ để nhận AccessToken từ (đã giải quyết vấn đề về hồ sơ null). Bạn chỉ cần sử dụng " https://developers.facebook.com/docs/android/graph#userdata " để nhận bất kỳ dữ liệu nào.


1
Nhưng cú pháp để có được email dob và giới tính là gì? bạn có thể vui lòng cho tôi biết
Sriyank Siddhartha

2
Tôi nhận được mã này dưới dạng mã thông báo truy cập: {Mã thông báo AccessToken: ACCESS_TOKEN_REMOVED: [user_friends, email, user_bapt, basic_info]} Tôi đang sử dụng mã này trong FacebookCallBack ---- AccessToken mAccessToken = loginResult.get Bạn có thể vui lòng cho tôi biết nó có nghĩa là gì? và làm thế nào để khắc phục lỗi này và nhận mã thông báo truy cập?
Sriyank Siddhartha

@SriyankSiddhartha Bạn có giải pháp nào cho việc này không? Bạn có thể cập nhật ở đây không, đối mặt với vấn đề tương tự
Mitchha1

@Sriyank, tôi cũng đang đối mặt với cùng một vấn đề, không thể lấy email id. Xin hãy giúp tôi nếu bạn tìm thấy bất kỳ giải pháp. cảm ơn trước.
Ramesh

Tôi vẫn không thể tìm thấy bất kỳ giải pháp nào ... Tôi hiện vẫn đang sử dụng sdk cũ .. xin vui lòng cho tôi biết nếu bạn nhận được giải pháp .. thankyou
Sriyank Siddhartha

8

Sau khi đăng nhập

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();
}


2

Điều này hiệu quả với tôi, Hy vọng sẽ giúp được ai đó (Sử dụng nút riêng của tôi chứ không phải nút đăng nhập 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"));
}
}

2

Sau đây là mã để tìm id email, tên và url hồ sơ, v.v.

    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);
    }

2

Đây là một giải pháp hoạt động (2019): đặt mã này vào logic đăng nhập của bạn;

 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();
        }
    });

0

Thêm dòng này vào nút Bấm vào

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


-3

Sử dụng phương thức tĩnh FB getCienProfile () của lớp Profile để lấy các thông tin đó.

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

39
Câu hỏi là về email, sinh nhật và giới tính. Điều này không trả lời bất kỳ điều đó.
Siamaster

2
điều này không cung cấp email
vishal dharankar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.