2015-08-25 2 views
28

Ich erstelle derzeit eine Testanwendung mit dem neuesten facebook SDK zu testen, um unsere bestehende Anwendung Problem zu aktualisieren ist, dass ich die E-Mail-Adresse, die ich weiß, hängt davon ab, ob der Benutzer hat einen auf sein Konto gestellt. Jetzt bietet das Konto, das ich zum Testen verwende, eine Sicherheit, aber aus unbekannten Gründen bietet das Facebook-SDK nur die Benutzer-ID und den vollständigen Namen des Kontos und sonst nichts. Ich bin verwirrt, da das SDK3 und darüber mehr Informationen als das aktualisierte SDK4 bietet und ich weiß nicht, wie ich die E-Mail bekommen soll, da alle Antworten, die ich bisher gesehen habe, die E-Mail nicht an meinem Ende bereitstellen. Hier ist mein Code so weit:Facebook Android SDK 4.5.0 erhalten E-Mail-Adresse

Login-Button

@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 Anforderung für 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 vollständiger Name meines Kontos, aber nicht die E-Mail. Hab ich etwas verpasst?

+0

ich vor einiger Zeit für mich denselben Code und seine Arbeit verwenden aber jetzt sein nicht funktioniert können Sie bitte vollständigen Code schreiben. Rückruf wird nicht –

Antwort

94

Sie müssen für die Parameter zu Facebook, um bitten, 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 Ihnen.

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; 
} 
+1

Wow! Danke vielmals. : D – KaHeL

+9

Ich musste hinzufügen 'btnLoginFb.setReadPermissions (Arrays.asList (" email "));' kurz vor 'btnLoginFb.registerCallback (...);' –

+0

Es funktioniert perfekt Vielen Dank. –

3

Statt den Wert des graphResponse zu bekommen, greifen Sie auf die E-Mail mit der JSONObject me

userEmail = jsonObject.getString("email"); 
+0

Ich habe es auch schon einmal versucht, aber nicht funktioniert. Was ich verpasst habe, sind die Parameter, die benötigt werden, bevor die Anfrage ausgeführt wird. – KaHeL

3

Hoffe, dass es Sie

/*** 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); 
      } 
     }); 
    } 
+0

"email" ist besser als getString (R.string.fbParamEmail). – CoolMind

1

Sie hilft auch GraphResponse Objekt, um die Werte zu erhalten

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

Setzen Sie diesen Code verwenden können:

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

vor

RegisterCallback 

sollte das Problem lösen.

0

Ich denke, bekomme E-Mail-Berechtigungen helfen können ..

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