Android Facebook 4.0 SDK So erhalten Sie E-Mail, Geburtsdatum und Geschlecht des Benutzers

144

Ich verwende den folgenden Code. Ich möchte das Geburtsdatum, die E-Mail-Adresse und das Geschlecht des Benutzers. Bitte helfen Sie. Wie kann ich diese Daten abrufen?

Das ist mein onViewCreated()Inneres im Fragment.

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

}

Dies ist meine Rückrufmethode.

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 Siddhartha
quelle
Hallo, @Sriyank, bitte helfen Sie mir, wenn Sie Ihr Problem gelöst haben. Ich möchte die Benutzerinformationen vom Facebook-Anmeldefragment erhalten, nachdem die Anmeldung abgeschlossen ist. Ich möchte zur nächsten Aktivität gehen. Bitte sagen Sie mir, wie ich das tun kann.
Devendra Singh
die Lösung unten, aber seien Sie vorsichtig, da die E-Mail möglicherweise leer ist, wenn der Benutzer über seine Telefonnummer angemeldet ist. Besuchen Sie stackoverflow.com/questions/29517667/… und stackoverflow.com/questions/29493486/…
pegaltier

Antworten:

335

Dies ist nicht der richtige Weg, um die Berechtigungen festzulegen, da Sie sie bei jedem Methodenaufruf überschreiben.

Ersetzen Sie dies:

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

Mit der folgenden Methode setReadPermissions()akzeptiert die Methode eine ArrayList:

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

Außerdem erfahren Sie hier, wie Sie zusätzliche Daten abfragen: 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());
        }
    });
}

BEARBEITEN:

Ein mögliches Problem ist, dass Facebook davon ausgeht, dass Ihre E-Mail ungültig ist. Verwenden Sie zum Testen den Graph API Explorer und versuchen Sie, ihn abzurufen. Wenn Sie Ihre E-Mail auch dort nicht erhalten können, ändern Sie sie in Ihren Profileinstellungen und versuchen Sie es erneut. Dieser Ansatz löste dieses Problem für einige Entwickler, die meine Antwort kommentierten.

schwertfisch
quelle
2
Hey @Schwertfisch kannst du zeigen wie man object.getString benutzt ("email"); , es wäre sehr hilfreich für mich :)
Ajeet
3
Warum erhalte ich den Fehler "Kein Wert für E-Mail", obwohl ich ihn bereits festgelegt habe loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
Stackex
1
@Schwertfisch In meinem Fall konnte ich meine E-Mail nicht einmal mit dem Graph API Explorer erhalten. Daher habe ich meinem Konto eine alternative E-Mail hinzugefügt und es hat funktioniert. Möglicherweise ist Ihre E-Mail ungültig.
Kayan Almeida
1
@DevendraSingh Sie haben die Werte abgerufen und in eine zusätzliche Zeile eingefügt: Intent myIntent = new Intent (this, SecondActivity.class); myIntent.putExtra ("email", object.getString ("email")); .... In der zweiten Aktivität Bundle extras = getIntent (). GetExtras (); if (extras! = null) {email = extras.getString ("email"); } Sie können auch eine statische Variable haben und den Wert zuweisen. Entschuldigung für mein Englisch. Ich weiß nicht, ob dies die Antwort ist, die Sie wollen
schwertfisch
85
Ich muss nur sagen, dass Facebook Docs so arm sind! Es ist eine Schande, dass wir hier herausfinden müssen, wie es geht.
Gal Rom
13

Verwenden Sie dieses Snippet, um alle Profilinformationen abzurufen

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

        }
    };
Arpit Patel
quelle
12

Sie erhalten kein Profil, das onSuccess()Sie ProfileTrackerzusammen mit der Registrierung des Rückrufs implementieren müssen

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

Vergessen Sie auch nicht, den Start und Stopp des Profil-Trackers zu regeln

Jetzt haben Sie ein Profil, von dem Sie AccessToken erhalten können (das Problem des Nullprofils wurde behoben). Sie müssen nur " https://developers.facebook.com/docs/android/graph#userdata " verwenden, um Daten abzurufen.

Ankit Bansal
quelle
1
Aber wie lautet die Syntax, um die E-Mail-Adresse und das Geschlecht zu erhalten?
Kannst
2
Ich erhalte dies als Zugriffstoken: {AccessToken-Token: ACCESS_TOKEN_REMOVED-Berechtigungen: [Benutzerfreunde, E-Mail, Benutzergeburtstag, Basisinfo]} Ich verwende diesen Code unter FacebookCallBack ---- AccessToken mAccessToken = loginResult.getAccessToken (); Können Sie mir bitte sagen, was es bedeutet? und wie man diesen Fehler behebt und Zugriffstoken erhält?
Sriyank Siddhartha
@ SriyankSiddhartha Haben Sie eine Lösung für dieses Problem? Könnten Sie hier aktualisieren, mit dem gleichen Problem
konfrontiert
@Sriyank, ich stehe auch vor dem gleichen Problem und kann keine E-Mail-ID erhalten. Bitte helfen Sie mir, wenn Sie Lösungen finden. Danke im Voraus.
Ramesh
Ich bin immer noch nicht in der Lage, eine Lösung zu finden ... Ich verwende derzeit noch alte SDK. Bitte lassen Sie mich wissen, wenn Sie die Lösung erhalten. Danke
Sriyank Siddhartha
8

Nach dem Login

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();
}
Ahamadullah Saikat
quelle
2

Dies funktioniert für mich, ich hoffe, jemandem zu helfen (mit meiner eigenen Schaltfläche nicht FB-Anmeldeschaltfläche)

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"));
}
}
Ali Adil
quelle
2

Im Folgenden finden Sie den Code zum Suchen der E-Mail-ID, des Namens und der Profil-URL usw.

    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);
    }
aanshu
quelle
2

Hier ist eine funktionierende Lösung (2019): Fügen Sie diesen Code in Ihre Anmeldelogik ein.

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

Fügen Sie diese Zeile hinzu, indem Sie auf die Schaltfläche Klicken klicken

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

adarsh
quelle
-3

Verwenden Sie die statische FB-Methode getCurrentProfile () der Profilklasse, um diese Informationen abzurufen.

 Profile profile = Profile.getCurrentProfile();
 String firstName = profile.getFirstName());
 System.out.println(profile.getProfilePictureUri(20,20));
 System.out.println(profile.getLinkUri());
Deepika
quelle
39
Die Frage bezieht sich auf E-Mail, Geburtstag und Geschlecht. Dies beantwortet nichts davon.
Siamaster
2
Dies gibt keine E-Mail
Vishal Dharankar