2013-05-02 11 views
10

ich Facebook 3.0 SDK für android bin mit. Ich muss Facebook Log-in implementieren. Ich habe Zugriff auf grundlegende Informationen des Benutzers wie Name, Benutzer-ID. Aber ich möchte auch Zugriff auf E-Mails des Benutzers haben. Ich bin durch viele Blogs und Foren gegangen, kann aber nicht herausfinden, wie das geht.Set Erlaubnis von Facebook Einloggen Benutzer des E-Mail-ID bekommen

Ich bin meine eigene Android-Taste für log mit in nicht com.facebook.widget.LoginButton. Wenn ich Facebook log in Schaltfläche war es einfach haben nur diese Zeilen verwenden:

authButton.setReadPermissions(Arrays.asList("basic_info","email")); 

Aber, ich meine eigene Anforderung haben, wird mit Standard-Android-Tasten gehen. Hier ist, was ich bisher getan hat:

Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
     this, Arrays.asList("email")); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLogin = (Button) findViewById(R.id.logIn); 
    mLogin.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    // start Facebook Login 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

     // callback when session changes state 
     @Override 
     public void call(final Session session, SessionState state, 
       Exception exception) { 
      if (session.isOpened()) { 
       session.requestNewReadPermissions(newPermissionsRequest); 
       // make request to the /me API 
       Request.executeMeRequestAsync(session, 
         new Request.GraphUserCallback() { 

          // callback after Graph API response with user 
          // object 
          @Override 
          public void onCompleted(GraphUser user, 
            Response response) { 
           if (user != null) {       
            System.out 
              .println("Facebook Response: " 
                + response.toString()); 
            access_token = session.getAccessToken(); 
            firstName = user.getFirstName(); 
            fb_user_id = user.getId(); 


            System.out 
              .println("Facebook Access token: " 
                + access_token); 
            System.out.println("First Name:" 
              + firstName); 
            System.out.println("FB USER ID: " 
              + fb_user_id); 


           } 
          } 
         }); 
      } 
     } 
    }); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, 
      resultCode, data); 
} 

Ich bin in der Lage, all diese Dinge zu bekommen, die ich in Protokolldruck, war aber nicht in der Lage E-Mail aus dem Benutzerprofil abgerufen werden.

Was kann ich dafür tun?

Jede Art von Hilfe wird geschätzt.

+0

haben Sie die Anwendungsinformationen auf der developer.facebook.com-Anwendungsseite hinzugefügt? – dwbrito

+0

Ja, wie Sie vorgeschlagen haben, habe ich E-Mail in die Berechtigung in Benutzer- und Freundesberechtigungen eingefügt. Aber bis jetzt kein Glück. – Anupam

+0

@Anupam Hallo, haben Sie einen Blick auf dieses Problem: http://stackoverflow.com/questions/30389180/facebook-oncompleted-email-java-lang-nullpointerexception – Sun

Antwort

15

es gelöst: Hier ist, was ich getan habe ...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLogin = (Button) findViewById(R.id.logIn); 
    mLogin.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    Session currentSession = Session.getActiveSession(); 
    if (currentSession == null || currentSession.getState().isClosed()) { 
     Session session = new Session.Builder(context).build(); 
     Session.setActiveSession(session); 
     currentSession = session; 
    } 

    if (currentSession.isOpened()) { 
     // Do whatever u want. User has logged in 

    } else if (!currentSession.isOpened()) { 
     // Ask for username and password 
     OpenRequest op = new Session.OpenRequest((Activity) context); 

     op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
     op.setCallback(null); 

     List<String> permissions = new ArrayList<String>(); 
     permissions.add("publish_stream"); 
     permissions.add("user_likes"); 
     permissions.add("email"); 
     permissions.add("user_birthday"); 
     op.setPermissions(permissions); 

     Session session = new Builder(MainActivity.this).build(); 
     Session.setActiveSession(session); 
     session.openForPublish(op); 
    } 
} 

public void call(Session session, SessionState state, Exception exception) { 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (Session.getActiveSession() != null) 
     Session.getActiveSession().onActivityResult(this, requestCode, 
       resultCode, data); 

    Session currentSession = Session.getActiveSession(); 
    if (currentSession == null || currentSession.getState().isClosed()) { 
     Session session = new Session.Builder(context).build(); 
     Session.setActiveSession(session); 
     currentSession = session; 
    } 

    if (currentSession.isOpened()) { 
     Session.openActiveSession(this, true, new Session.StatusCallback() { 

      @Override 
      public void call(final Session session, SessionState state, 
        Exception exception) { 

       if (session.isOpened()) { 

        Request.executeMeRequestAsync(session, 
          new Request.GraphUserCallback() { 

           @Override 
           public void onCompleted(GraphUser user, 
             Response response) { 
            if (user != null) { 

             TextView welcome = (TextView) findViewById(R.id.welcome); 
             welcome.setText("Hello " 
               + user.getName() + "!"); 

             access_token = session 
               .getAccessToken(); 
             firstName = user.getFirstName(); 
             fb_user_id = user.getId(); 

             System.out 
               .println("Facebook Access token: " 
                 + access_token); 
             System.out.println("First Name:" 
               + firstName); 
             System.out.println("FB USER ID: " 
               + fb_user_id); 

            } 
           } 
          }); 
       } 
      } 
     }); 
    } 
} 

Jetzt E-Mail die Erlaubnis, mit Rest der veröffentlichen Erlaubnis zu bekommen, ich bin in der Lage.

Kennzeichnung dies als akzeptierte Antwort, so dass sie anderen helfen können.

+5

Ich habe versucht, Leseberechtigungen wie folgt zu setzen: 'authButton.setReadPermissions (Arrays.asList (" email "));' und dann versuchte, auf die E-Mail wie diese 'user.asMap(). Get (" email ")' aber zuzugreifen es gibt immer 'null' zurück. – toobsco42

+0

Wo müssen wir FacebookAppId in diesem Beispiel einstellen? –

+0

In Werten/strings.xml als 'appId' – Anupam

2

TL; DR: so etwas wie diese verwenden, um die E-Mail zu erhalten:

String email = (String) user.getProperty("email"); 

ich einen Kommentar über Ihren Code haben. Da "E-Mail" eine Leseberechtigung ist, müssen Sie keine separate Berechtigungsanforderung erstellen, um sie zu erhalten. Sie können etwas tun (ungetestet Code, so dass es möglicherweise leichte Fehler sein):

Session s = new Session(this); 
Session.setActiveSession(s); 
Session.OpenRequest request = new Session.OpenRequest(this); 
request.setPermissions(Arrays.asList("basic_info","email")); 
request.setCallback(/* your callback here */); 
s.openForRead(request); 

und Sie können der neuen Berechtigungsanfrage in Ihrem Rückruf loszuwerden.

+0

Waren nehme ich dieses Stück Code in meinem 'MainActivity'? 'String email = (String) user.getProperty (" email ");' gibt mir null Antwort. – Anupam

+0

Sie können dies in eine beliebige Aktivität einfügen. –

+0

Wie Sie sehen können, öffne ich die Sitzung auf 'onClick()', also muss ich Ihren Code darin einfügen. Und was wird hier 'request.setCallback (/ * Ihr Rückruf hier * /);', was kann mein Rückruf sein? Bitte führe mich durch das. Es wird sehr hilfreich für mich sein. – Anupam