Android Facebook 4.0 SDK E-posta, Doğum Tarihi ve Kullanıcının cinsiyeti nasıl alınır?


144

Aşağıdaki kodu kullanıyorum. Kullanıcının Doğum Tarihi, E-posta ve Cinsiyetini istiyorum. Lütfen yardım et. Bu veriler nasıl alınır?

Bu onViewCreated()Parçanın içindeki benim .

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

}

Bu benim Geri Arama Yöntemim.

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


Merhaba, @Sriyank, sorununuzu çözdüyseniz lütfen bana yardımcı olun. giriş tamamlandıktan sonra facebook signin fragment kullanıcı bilgilerini almak istiyorum sonraki faaliyete gitmek istiyorum lütfen bana bunu nasıl yapabilirim söyle?
Devendra Singh

kullanıcı kendi telefon numarasını Ziyaret aracılığıyla kaydedilir eğer eposta boş olabilir çünkü aşağıda çözüm ama dikkatli olun stackoverflow.com/questions/29517667/... ve stackoverflow.com/questions/29493486/...
pegaltier

Yanıtlar:


335

Her yöntem çağrısında bunların üzerine yazarken izinleri ayarlamak için doğru yol bu değildir.

Bunu değiştirin:

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

Yöntemin setReadPermissions()bir ArrayList'i kabul ettiği gibi aşağıdakilerle :

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

Ekstra GraphRequest verileri nasıl sorgulanır:

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

DÜZENLE:

Olası bir sorun, Facebook'un e-postanızın geçersiz olduğunu varsaymasıdır. Test etmek için Grafik API Gezgini'ni kullanın ve almaya çalışın. Orada bile e-postanızı alamıyorsanız, profil ayarlarınızda değiştirin ve tekrar deneyin. Bu yaklaşım, cevabımı yorumlayan bazı geliştiriciler için bu sorunu çözdü.


2
Hey @Schwertfisch object.getString ("email") öğesinin nasıl kullanılacağını gösterebilir; , benim için çok yararlı olurdu :)
Ajeet

3
önceden ayarlamış olmama rağmen neden "E-posta için değer yok" hatası alıyorum loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
stackex

1
@Schwertfisch benim durumumda, Grafik API Gezgini'ni kullanarak bile e-postamı alamadım, bu yüzden hesabıma alternatif bir e-posta ekledim ve işe yaradı, belki e-postanız geçersiz.
Kayan Almeida

1
@DevendraSingh değerleri almak ve onları ekstra bir koymak, Intent myIntent = new Intent (this, SecondActivity.class); myIntent.putExtra ("e-posta", object.getString ("e-posta")); .... İkinci etkinlikte Bundle extras = getIntent (). GetExtras (); if (extras! = null) {email = extras.getString ("email"); } Ayrıca statik bir değişkeniniz olabilir ve değeri atayabilirsiniz. İngilizcem için üzgünüm. İstediğin cevap bu mu bilmiyorum
schwertfisch

85
Sadece Facebook Dokümanlarının çok fakir olduğunu söylemeliyim! Burada nasıl yapılacağını öğrenmemiz gereken bir utanç.
Gal Rom

13

Tüm profil bilgilerini almak için bu snippet'i kullanın

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

Profile geri çağrı kaydetme ile birlikte onSuccess()uygulamanız gerekmeyecekProfileTracker

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

Ayrıca profil izleyicinin başlangıcını ve bitişini kullanmayı da unutmayın

Şimdi AccessToken'i almak için bir profiliniz olacak (boş profil sorununu çözdünüz). Herhangi bir veri almak için " https://developers.facebook.com/docs/android/graph#userdata " adresini kullanmanız yeterlidir .


1
Ancak, e-posta dob ve cinsiyetini almak için sözdizimi nedir? lütfen bana söyleyebilir misiniz
Sriyank Siddhartha

2
Bunu bir Access belirteci olarak alıyorum: {AccessToken belirteci: ACCESS_TOKEN_REMOVED izinleri: [user_friends, e-posta, user_birthday, basic_info]} Bu kodu FacebookCallBack ---- AccessToken mAccessToken = loginResult.getAccessToken () altında kullanıyorum; Bana bunun ne anlama geldiğini söyleyebilir misiniz? ve bu hatayı nasıl çözebilir ve Access belirteci alabilirim?
Sriyank Siddhartha

@SriyankSiddhartha Bunun için bir çözüm var mı? Burada güncellenebilir misiniz, Aynı sorunla karşı karşıya
Prabha1

@Sriyank, ben de aynı sorunla karşı karşıyayım, e-posta kimliği alamıyorum. Herhangi bir çözüm bulursanız lütfen bana yardımcı olun. şimdiden teşekkürler.
Ramesh

Ben hala herhangi bir çözüm bulamıyorum ... Şu anda hala eski SDK kullanıyorum .. lütfen u çözüm olsun bana bildirin .. teşekkür ederim
Sriyank Siddhartha 27:05

8

Giriş yaptıktan sonra

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

Bu benim için çalıştı, birine yardım etmeyi umuyorum (FB giriş düğmesini değil kendi düğmemi kullanarak)

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

Aşağıda e-posta kimliği, ad ve profil URL'si vb.

    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

İşte çalışan bir çözüm (2019): bu kodu giriş mantığınıza yerleştirin;

 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

Bu satırı Tıkla düğmesine ekle

loginButton.setReadPermissions (Arrays.asList ("public_profile", "e-posta", "user_birthday", "user_friends"));


-3

Bu bilgileri almak için Profile sınıfının FB statik yöntemini getCurrentProfile () yöntemini kullanın.

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

39
Soru, e-posta, doğum günü ve cinsiyet hakkındadır. Bu hiçbirine cevap vermiyor.
Siamaster

2
bu e-posta vermez
vishal dharankar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.