it-swarm.com.de

Facebook Android SDK 4.5.0 E-Mail-Adresse erhalten

Ich bin gerade dabei, eine Testanwendung zu erstellen, um mit dem neuesten Facebook-SDK zu testen, um unser bestehendes Anwendungsproblem zu aktualisieren. Ich muss die E-Mail-Adresse abrufen, von der ich weiß, dass sie vom Benutzer angegeben wurde. Nun bietet das Konto, das ich zum Testen verwende, eine Sicherheit, aber aus unbekannten Gründen enthält das Facebook-SDK nur die user_id und den vollständigen Namen des Kontos und nichts anderes. Ich bin darüber verwirrt, da das SDK3 und höher mehr Informationen enthält als das aktualisierte SDK4, und ich bin nicht ganz sicher, wie ich die E-Mail erhalten kann, da alle Antworten, die ich bisher gesehen habe, die E-Mail auf meiner Seite nicht liefern. Hier ist mein Code bisher:

Login-Schaltfläche

@OnClick(R.id.btn_login)
    public void loginFacebook(){
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
    }

LoginManager-Rückruf:

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                requestUserProfile(loginResult);
            }

            @Override
            public void onCancel() {
                Toast.makeText(getBaseContext(),"Login Cancelled", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(FacebookException e) {
                Toast.makeText(getBaseContext(),"Problem connecting to Facebook", Toast.LENGTH_SHORT).show();
            }
        });

Und die Aufforderung zum Benutzerprofil:

public void requestUserProfile(LoginResult loginResult){
        GraphRequest.newMeRequest(
                loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject me, GraphResponse response) {
                        if (response.getError() != null) {
                            // handle error
                        } else {
                            try {
                                String email = response.getJSONObject().get("email").toString();
                                Log.e("Result", email);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            String id = me.optString("id");
                            // send email and id to your web server
                            Log.e("Result1", response.getRawResponse());
                            Log.e("Result", me.toString());
                        }
                    }
                }).executeAsync();
    }

Die JSON-Antwort gibt nur die ID und den vollständigen Namen meines Kontos zurück, enthält jedoch keine E-Mail-Adresse. Habe ich etwas verpasst?

32
KaHeL

Sie müssen nach Parametern für Facebook fragen, um Ihre Daten zu erhalten. Hier poste ich meine Funktion, wo ich die Facebook-Daten bekomme. Der Schlüssel ist in dieser Zeile:

parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook

Ich hoffe es hilft dir.

btnLoginFb.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

        @Override
        public void onSuccess(LoginResult loginResult) {

            System.out.println("onSuccess");
            progressDialog = new ProgressDialog(LoginActivity.this);
            progressDialog.setMessage("Procesando datos...");
            progressDialog.show();
            String accessToken = loginResult.getAccessToken().getToken();
            Log.i("accessToken", accessToken);

            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {

                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    Log.i("LoginActivity", response.toString());
                    // Get facebook data from login
                    Bundle bFacebookData = getFacebookData(object); 
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel() {
            System.out.println("onCancel");
        }

        @Override
        public void onError(FacebookException exception) {
            System.out.println("onError");
            Log.v("LoginActivity", exception.getCause().toString());
        }
    });



private Bundle getFacebookData(JSONObject object) {

        try {
            Bundle bundle = new Bundle();
            String id = object.getString("id");

            try {
                URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?width=200&height=150");
                Log.i("profile_pic", profile_pic + "");
                bundle.putString("profile_pic", profile_pic.toString());

            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }

            bundle.putString("idFacebook", id);
            if (object.has("first_name"))
                bundle.putString("first_name", object.getString("first_name"));
            if (object.has("last_name"))
                bundle.putString("last_name", object.getString("last_name"));
            if (object.has("email"))
                bundle.putString("email", object.getString("email"));
            if (object.has("gender"))
                bundle.putString("gender", object.getString("gender"));
            if (object.has("birthday"))
                bundle.putString("birthday", object.getString("birthday"));
            if (object.has("location"))
                bundle.putString("location", object.getJSONObject("location").getString("name"));

            return bundle;
        }
      catch(JSONException e) {
        Log.d(TAG,"Error parsing JSON");
      }
    return null;
}
100
Marta Tenés

Ich hoffe es hilft dir 

/*** setupFacebook stuff like make login with facebook and get the userId,Name and Email*/
    private void setupFacebookStuff() {
        Log.e(TAG, "key hash= " + Utils.getKeyHash(SplashActivity.this, getPackageName()));

        // This should normally be on your application class
        FacebookSdk.sdkInitialize(SplashActivity.this);

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
                   currentAccessToken.getToken();
            }
        };

        loginManager = LoginManager.getInstance();
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                preference.setUserLogin(true);

                final GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        try {
                                Log.e("id", "" + object);

                            if (object.has(getString(R.string.fbParamId))) {

                                final String userId = object.optString(getString(R.string.fbParamId));
                                final String userPicture = "https://graph.facebook.com/" + object.optString(getString(R.string.fbParamId)) + "/picture?type=large";

                                preference.setUserId(userId);
                                preference.setUserPictureUrl(userPicture);

                            }
                            if (object.has(getString(R.string.fbParamUserName))) {


                                final String userName = object.optString(getString(R.string.fbParamUserName));
                                preference.setUserName(userName);
                            }

                            if (object.has(getString(R.string.fbParamEmail))) {

                                final String userEmail = object.optString(getString(R.string.fbParamEmail));
                                preference.setUserName(userEmail);
                                Log.e("useremail", userEmail);
                            }

                            callMainActivity(true);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });

                final Bundle parameters = new Bundle();
                parameters.putString("fields", "name,email,id");
                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
                Toast.makeText(getBaseContext(), "Login Cancelled", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(FacebookException error) {
                Toast.makeText(getBaseContext(), "Problem connecting to Facebook", Toast.LENGTH_SHORT).show();
                Log.e(TAG, "Facebook login error " + error);
            }
        });
    }
3
Sejal Baraiya

Statt den Wert von graphResponse abzurufen, greifen Sie mit dem JSONObject me auf die E-Mail zu.

userEmail = jsonObject.getString("email");
3
Jeongbebs

Ich denke, das Erhalten von E-Mail-Berechtigungen kann helfen ..

LoginManager.getInstance().logInWithReadPermissions(
fragmentOrActivity,
Arrays.asList("email"));
1
Usman Malik

Sie können auch das GraphResponse-Objekt verwenden, um die Werte abzurufen

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) {
                            Log.v("LoginActivity", response.toString());
                            try {
                                // Application code
                                String email = response.getJSONObject().getString("email");
                                txtStatus.setText("Login Success \n" + email);
                            }catch(Exception e){
                                e.printStackTrace();;
                            }
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender,birthday");
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel()
        {
            txtStatus.setText("==============Login Cancelled=============");
        }

        @Override
        public void onError(FacebookException exception)
        {
            txtStatus.setText("==============Login Error=================");
            exception.printStackTrace();
        }
    });
1
Ritesh

Information

Wenn Sie die Erlaubnis erhalten, eine E-Mail-Adresse zu erhalten, dann kann Facebook Ihnen nicht jedes Mal Ihre E-Mail-Adresse oder andere Details mitteilen.

Wenn sich ein Facebook-Nutzer nicht mit seiner E-Mail-Adresse anmeldet. Wenn Facebook Sie nicht kann, kann er seine E-Mail-Adresse nicht angeben.

Wenn sich der Benutzer über eine E-Mail-Adresse bei Facebook anmeldet, erhalten Sie eine E-Mail von Facebook.

Facebook SDK enthält nur öffentliche Details.

ein Login bei Facebook über E-Mail-Adresse und auch mit Telefonnummer durch.

0
D Prince

Diesen Code setzen:

btnLoginFb.setReadPermissions(Arrays.asList("email"));

vor

RegisterCallback

sollte das Problem lösen.

0
Rao Farhan