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

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

Dies ist meine onViewCreated() innerhalb des Fragments.

 @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 callbackmethode.

 private FacebookCallback mFacebookCallback = new FacebookCallback() { @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); } }; 

    Das 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 akzeptiert setReadPermissions() eine ArrayList:

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

    Hier ist auch, wie Sie zusätzliche Daten GraphRequest abfragen:

     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() { @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-Adresse ungültig ist. Um es zu testen, verwenden Sie den Graph API Explorer und versuchen Sie es zu bekommen. Wenn Sie Ihre E-Mail-Adresse nicht erhalten, ändern Sie sie in Ihren Profileinstellungen und versuchen Sie es erneut. Dieser Ansatz triggerse dieses Problem für einige Entwickler, die meine Antwort kommentieren.

    Sie erhalten kein Profil in onSuccess() Sie müssen ProfileTracker zusammen mit der Registrierung von Callback implementieren

     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

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

    Verwenden Sie dieses Snippet, um alle Profilinformationen abzurufen

     private FacebookCallback callback = new FacebookCallback() { @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) { } }; 

    Sie können die GraphRequest-class verwenden, um Aufrufe an die Facebook Graph-API zu senden, um Benutzerinformationen abzurufen. Weitere Informationen finden Sie unter https://developers.facebook.com/docs/android/graph .

    Nach der Anmeldung

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

    Dies ist für mich funktioniert, hoffe, jemandem zu helfen (mit meiner eigenen Taste nicht FB Login-Taste)

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

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

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