Android Facebook 4.0 SDK Cara mendapatkan Email, Tanggal Lahir dan jenis kelamin Pengguna

144

Saya menggunakan kode berikut. Saya ingin Tanggal Lahir, Email dan Jenis Kelamin pengguna. Tolong bantu. Bagaimana cara mengambil data itu?

Ini adalah onViewCreated()bagian dalam diriku .

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

}

Ini adalah Metode Callback saya.

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
sumber
Hai, @Sriyank tolong bantu saya jika Anda menyelesaikan masalah Anda. saya ingin mendapatkan info pengguna dari fragmen masuk facebook setelah masuk selesai ingin melanjutkan kegiatan selanjutnya tolong beri tahu saya bagaimana saya bisa melakukannya?
Devendra Singh
solusi di bawah ini tetapi hati-hati karena email mungkin kosong jika pengguna login melalui nomor teleponnya. Kunjungi stackoverflow.com/questions/29517667/… dan stackoverflow.com/questions/29493486/…
pegaltier

Jawaban:

335

Itu bukan cara yang tepat untuk mengatur izin saat Anda menimpa mereka dengan setiap pemanggilan metode.

Ganti ini:

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

Dengan berikut ini, ketika metode setReadPermissions()menerima ArrayList:

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

Juga di sini adalah cara untuk meminta data tambahan 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());
        }
    });
}

EDIT:

Satu masalah yang mungkin terjadi adalah Facebook menganggap bahwa email Anda tidak valid. Untuk mengujinya, gunakan Graph API Explorer dan cobalah untuk mendapatkannya. Jika bahkan di sana Anda tidak bisa mendapatkan email Anda, ubahlah dalam pengaturan profil Anda dan coba lagi. Pendekatan ini menyelesaikan masalah ini untuk beberapa pengembang yang mengomentari jawaban saya.

schwertfisch
sumber
2
Hey @Schwertfisch dapatkah Anda menunjukkan cara menggunakan object.getString ("email"); , itu akan sangat membantu saya :)
Ajeet
3
mengapa saya mendapatkan kesalahan "Tidak ada nilai untuk email" meskipun saya sudah menetapkan loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
stackex
1
@Schwertfisch dalam kasus saya, saya tidak bisa mendapatkan email saya bahkan menggunakan Graph API Explorer, jadi saya menambahkan email alternatif ke akun saya dan berhasil, mungkin email Anda tidak valid.
Kayan Almeida
1
@DevendraSingh Anda harus mendapatkan nilai dan memasukkannya ke dalam ekstra, Intent myIntent = new Intent (this, SecondActivity.class); myIntent.putExtra ("email", object.getString ("email")); .... Dalam aktivitas kedua Bundel ekstra = getIntent (). GetExtras (); if (ekstra! = null) {email = extras.getString ("email"); } Anda juga dapat memiliki variabel statis dan menetapkan nilainya. Maaf untuk bahasa inggris saya. Saya tidak tahu apakah ini jawaban yang Anda inginkan
schwertfisch
85
Saya hanya harus mengatakan bahwa Facebook Documents sangat buruk! Sayang sekali kita perlu mencari tahu bagaimana melakukannya di sini.
Gal Rom
13

Gunakan cuplikan ini untuk mendapatkan semua info profil

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
sumber
12

Anda tidak akan mendapatkan Profil di dalam onSuccess()Anda perlu menerapkan ProfileTrackerbersama dengan mendaftar panggilan balik

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

Juga jangan lupa untuk menangani awal dan berhenti pelacak profil

Sekarang Anda akan memiliki profil untuk mendapatkan AccessToken dari (menyelesaikan masalah profil nol). Anda hanya perlu menggunakan " https://developers.facebook.com/docs/android/graph#userdata " untuk mendapatkan data apa pun.

Ankit Bansal
sumber
1
Tapi apa sintaks untuk mendapatkan email dob dan jenis kelamin? bisakah kau memberitahuku
Sriyank Siddhartha
2
Saya mendapatkan ini sebagai token Access: {AccessToken token: ACCESS_TOKEN_REMOVED izin: [user_friends, email, user_birthday, basic_info]} Saya menggunakan kode ini di FacebookCallBack ---- AccessToken mAccessToken = loginResult.getAccessToken (); Bisakah Anda memberi tahu saya apa artinya? dan bagaimana cara mengatasi kesalahan ini dan mendapatkan token Akses?
Sriyank Siddhartha
@SriyankSiddhartha Apakah Anda punya solusi untuk ini? Bisakah Anda memperbarui di sini, Menghadapi masalah yang sama
Prabha1
@ Siryank, saya juga menghadapi masalah yang sama, tidak bisa mendapatkan email id. tolong bantu saya jika Anda menemukan solusi. Terima kasih sebelumnya.
Ramesh
Saya masih tidak dapat menemukan solusi apa pun ... Saya saat ini masih menggunakan SDK lama .. tolong beri tahu saya jika Anda mendapatkan solusinya .. terima kasih
Sriyank Siddhartha
8

Setelah Masuk

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
sumber
2

Ini berfungsi untuk saya, Berharap untuk membantu seseorang (Menggunakan tombol saya sendiri bukan tombol masuk 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"));
}
}
Ali Adil
sumber
2

Berikut ini adalah kode untuk menemukan id email, nama dan url profil, dll

    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
sumber
2

Inilah solusi yang berfungsi (2019): masukkan kode ini ke dalam logika login Anda;

 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
sumber
0

Tambahkan baris ini pada tombol Klik pada

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

Adarsh
sumber
-3

Gunakan metode statis FB getCurrentProfile () dari kelas Profile untuk mengambil info tersebut.

 Profile profile = Profile.getCurrentProfile();
 String firstName = profile.getFirstName());
 System.out.println(profile.getProfilePictureUri(20,20));
 System.out.println(profile.getLinkUri());
Deepika
sumber
39
Pertanyaannya adalah tentang email, ulang tahun, dan gender. Ini tidak menjawab semua itu.
Siamaster
2
ini tidak memberikan email
vishal dharankar