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


यदि आपने अपना मुद्दा हल कर लिया, तो हाय, @ श्रीयान कृपया मेरी मदद करें। मैं लॉगिन करने के बाद फेसबुक साइनइन टुकड़ा से उपयोगकर्ता जानकारी प्राप्त करना चाहता हूं, पूरी तरह से जाने के बाद अगली गतिविधि कृपया मुझे बताएं कि मैं यह कैसे कर सकता हूं?
देवेन्द्र सिंह

क्योंकि ईमेल खाली हो सकता है अगर उपयोगकर्ता अपने फोन नंबर पर जाएँ के माध्यम से लॉग होता है नीचे समाधान लेकिन सावधान रहना 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"));

यहाँ यह भी बताया गया है कि अतिरिक्त डेटा को कैसे लिखें।

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

संपादित करें:

एक संभावित समस्या यह है कि फेसबुक मानता है कि आपका ईमेल अमान्य है। इसका परीक्षण करने के लिए, ग्राफ़ एपीआई एक्सप्लोरर का उपयोग करें और इसे प्राप्त करने का प्रयास करें। अगर वहां भी आपको अपना ईमेल नहीं मिल रहा है, तो इसे अपनी प्रोफ़ाइल सेटिंग में बदलें और पुनः प्रयास करें। इस दृष्टिकोण ने मेरे उत्तर पर टिप्पणी करने वाले कुछ डेवलपर्स के लिए इस मुद्दे को हल किया।


2
अरे @Schwertfisch आप दिखा सकते हैं कि ऑब्जेक्ट का उपयोग कैसे करें। गैजेट ("ईमेल"); , यह मेरे लिए बहुत उपयोगी होगा :)
अजीत

3
पहले से सेट होने के बावजूद मुझे "ईमेल के लिए कोई मूल्य नहीं" त्रुटि क्यों मिलती है loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
स्टैकेक्स

1
मेरे मामले में @Schwertfisch, मैं ग्राफ़ एपीआई एक्सप्लोरर का उपयोग करके भी अपना ईमेल प्राप्त नहीं कर सका, इसलिए मैंने अपने खाते में एक वैकल्पिक ईमेल जोड़ा और यह काम कर गया, शायद आपका ईमेल अमान्य है।
कायन अल्मेडा

1
@ देवेंद्रसिंह आपके पास मूल्य हैं और उन्हें एक अतिरिक्त, आशय myIntent = new Intent (यह, SecondActivity.class) में डाल दिया है; myIntent.putExtra ("ईमेल", object.getString ("ईमेल")); .... । दूसरी गतिविधि में बंडल एक्स्ट्रा = getIntent ()। GetExtras (); अगर (एक्स्ट्रा कलाकार! = null) {ईमेल = extras.getString ("ईमेल"); } इसके अलावा आप एक स्थिर चर और मान असाइन कर सकते हैं। मेरी अंग्रेजी के लिए खेद है। मुझे नहीं पता कि यह वह उत्तर है जो आप चाहते हैं
schwertfisch

85
मेरा सिर्फ इतना कहना है कि फेसबुक डॉक्स इतने घटिया हैं! यह शर्म की बात है कि हमें यह पता लगाने की ज़रूरत है कि यहाँ कैसे करना है।
गाला रोम

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
लेकिन ईमेल डॉब और लिंग प्राप्त करने के लिए वाक्यविन्यास क्या है? क्या आप मुझे बता सकते हैं
श्रीयांक सिद्धार्थ

2
मुझे यह एक्सेस टोकन के रूप में मिल रहा है: {AccessToken token: ACCESS_TOKEN_REMOVED अनुमतियां: [user_friends, email, user_birthday, basic_info]} मैं FacebookCallBack के माध्यम से इस कोड का उपयोग कर रहा हूं ---- AccessToken mAccessToken = loginResult.getToken () क्या आप मुझे बता सकते हैं कि इसका क्या मतलब है? और इस त्रुटि को कैसे हल करें और एक्सेस टोकन प्राप्त करें?
श्रीकांत सिद्धार्थ

आप इस के लिए किसी भी समाधान मिल गया @SriyankSiddhartha क्या तुम यहाँ अद्यतन किया जा सका, एक ही मुद्दे का सामना?
Prabha1

@ श्रीकांत, मैं भी इसी मुद्दे का सामना कर रहा हूं, ईमेल आईडी प्राप्त करने में सक्षम नहीं। अगर आपको कोई उपाय मिले तो कृपया मेरी मदद करें। अग्रिम में धन्यवाद।
रमेश

मैं अभी भी कोई समाधान नहीं ढूंढ पा रहा हूं ... मैं अभी भी पुराने एसडीके का उपयोग कर रहा हूं .. कृपया मुझे बताएं कि क्या आपको समाधान मिल गया है ..
धन्यवाद

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

3

उपयोगकर्ता जानकारी प्राप्त करने के लिए आप फेसबुक ग्राफ एपीआई पर कॉल जारी करने के लिए ग्राफरप्लेस्ट क्लास का उपयोग कर सकते हैं। अधिक जानकारी के लिए https://developers.facebook.com/docs/android/graph देखें ।


2

यह मेरे लिए काम कर रहा है, किसी की मदद करने की आशा है (अपने स्वयं के बटन का उपयोग करके एफबी लॉगिन बटन नहीं)

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

ईमेल आईडी, नाम और प्रोफाइल यूआरएल आदि को खोजने के लिए कोड निम्नलिखित है

    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.setReadPims (Arrays.asList ("public_profile", "email", "user_birthday", "user_friends"));


-3

उन सूचनाओं को पुनः प्राप्त करने के लिए FB स्टेटिक विधि getCurrentProfile () का उपयोग करें।

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

39
प्रश्न ईमेल, जन्मदिन और लिंग के बारे में है। इसका कोई जवाब नहीं है।
सियामास्टर

2
यह ईमेल नहीं देता है
vishaha dharankar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.