Android Facebook 4.0 SDK 이메일, 생년월일 및 사용자 성별을 얻는 방법


144

다음 코드를 사용하고 있습니다. 사용자의 생년월일, 이메일 및 성별을 원합니다. 도와주세요. 해당 데이터를 검색하는 방법?

이것은 내 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);
    }
};


안녕하세요, @Sriyank 문제를 해결 한 경우 도와주세요. 로그인 완료 후 페이스 북 로그인 조각에서 사용자 정보를 얻고 싶습니다. 다음 활동으로 가고 싶습니다. 어떻게 할 수 있습니까?
Devendra Singh

사용자가 자신의 전화 번호를 통해 로그인 한 경우 이메일이 비어있을 수 있으므로 아래 해결책을 참고하십시오. stackoverflow.com/questions/29517667/…stackoverflow.com/questions/29493486/…
pegaltier

답변:


335

각 메소드 호출로 권한을 겹쳐 쓸 때 권한을 설정하는 올바른 방법은 아닙니다.

이것을 교체하십시오 :

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를 사용하여 가져 오십시오. 이메일을받을 수없는 경우에도 프로필 설정에서 이메일을 변경하고 다시 시도하십시오. 이 접근 방식은 일부 개발자가 내 답변을 주석으로 처리 하여이 문제를 해결했습니다.


2
@Schwertfisch 님, object.getString ( "email"); , 그것은 나를 위해 매우 도움이 될 것입니다 :)
Ajeet

3
이미 설정 했는데도 "이메일에 대한 가치 없음"오류가 발생하는 이유는 loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));무엇입니까?
stackex

1
제 경우에는 @Schwertfisch에서 Graph API Explorer를 사용해도 이메일을받을 수 없으므로 대체 이메일을 내 계정에 추가했는데 제대로 작동하지 않을 수 있습니다. 이메일이 유효하지 않을 수 있습니다.
Kayan Almeida

1
@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"); } 또한 정적 변수를 가지고 값을 할당 할 수 있습니다. 내 영어가 유감입니다. 이것이 당신이 원하는 답변인지 모르겠습니다
schwertfisch

85
나는 단지 페이스 북 문서가 너무 가난하다고 말해야한다! 여기서 어떻게해야하는지 아는 것은 부끄러운 일입니다.
Gal Rom

13

모든 프로필 정보를 얻으려면이 스 니펫을 사용하십시오.

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

콜백 등록과 함께 onSuccess()구현해야 할 프로필이 없습니다.ProfileTracker

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

또한 프로파일 트래커 의 시작 및 중지를 처리하는 것을 잊지 마십시오

이제 AccessToken을 가져올 수있는 프로필이 생성됩니다 (널 프로필 문제 해결). 데이터를 얻으려면 " https://developers.facebook.com/docs/android/graph#userdata " 를 사용해야 합니다.


1
그러나 이메일 dob와 성별을 얻는 구문은 무엇입니까? 말해 줄래요
Sriyank Siddhartha

2
이 코드를 액세스 토큰으로 가져옵니다. {AccessToken 토큰 : ACCESS_TOKEN_REMOVED 권한 : [user_friends, email, user_birthday, basic_info]} FacebookCallBack에서이 코드를 사용하고 있습니다. ---- AccessToken mAccessToken = loginResult.getAccessToken (); 무슨 뜻인지 말씀해 주시겠습니까? 이 오류를 해결하고 액세스 토큰을 얻는 방법은 무엇입니까?
Sriyank Siddhartha

@SriyankSiddhartha이 문제에 대한 해결책이 있습니까? 동일한 문제에 직면하여 여기서 업데이트 할 수 있습니까
Prabha1

@ Sriyank, 나는 같은 문제에 직면하고 있으며 이메일 ID를 얻을 수 없습니다. 해결책을 찾으면 도와주세요. 미리 감사드립니다.
Ramesh

나는 여전히 어떤 해결책을 찾을 수 없습니다 ... 나는 아직도 오래된 SDK를 사용하고 있습니다 .. 당신이 해결책을 얻는다면 알려주십시오 .. thankyou
Sriyank Siddhartha

8

로그인 후

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

이것은 나를 위해 일했습니다. 누군가를 돕기를 바랍니다 (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

다음은 이메일 ID, 이름 및 프로필 URL 등을 찾는 코드입니다.

    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

다음은 작동하는 솔루션입니다 (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();
        }
    });

0

클릭 버튼에이 줄 추가

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


-3

이러한 정보를 검색하려면 Profile 클래스의 FB 정적 메소드 getCurrentProfile ()을 사용하십시오.

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

39
질문은 이메일, 생일 및 성별에 관한 것입니다. 이것은 그 어느 것도 대답하지 않습니다.
Siamaster

2
이메일을 보내지 않습니다
vishal dharankar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.