2013-05-02 112 views
10

我正在使用Facebook 3.0 SDK为Android。我必须执行Facebook登录。我正在访问用户的基本信息,如姓名,用户ID。但我想要访问用户的电子邮件。我经历了许多博客和论坛,但无法弄清楚如何做到这一点。设置从Facebook上获取用户的电子邮件ID的权限登录

我正在使用我自己的android按钮登录而不是com.facebook.widget.LoginButton。如果我使用Facebook登录按钮很容易只需要使用这些行:

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

但是,我有自己的要求,就不得不去与Android默认的按钮。以下是我迄今所做的:

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

我能够得到所有那些我在日志中我打印的东西,但无法从用户配置文件检索电子邮件。

我能为此做些什么?

任何形式的帮助将不胜感激。

+0

您是否在developer.facebook.com应用程序页面中添加了应用程序信息? – dwbrito 2013-05-02 10:39:51

+0

是的,正如你所建议的,我在用户和朋友权限的权限中添加了电子邮件。但直到现在还没有运气。 – Anupam 2013-05-02 10:43:17

+0

@Anupam你好,看看这个问题:http://stackoverflow.com/questions/30389180/facebook-oncompleted-email-java-lang-nullpointerexception – Sun 2015-05-26 12:07:08

回答

15

解决了这个问题:这是我做了什么......

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

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

现在我能够得到电子邮件的权限与发布许可的休息。

将此标记为接受的答案,以便它可以帮助他人。

+5

我试图设置读取权限,如下所示:'authButton.setReadPermissions(Arrays.asList(“email”));'然后试图访问这样的电子邮件'user.asMap()。get(“email”)'但它总是返回'null'。 – toobsco42 2013-08-09 18:52:08

+0

在这个例子中,我们需要设置FacebookAppId吗? – 2013-11-01 12:16:13

+0

在values/strings.xml中作为'appId' – Anupam 2013-11-01 15:19:23

2

TL; DR:使用类似这样的方式获取电子邮件:

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

我对您的代码有一个评论。由于“电子邮件”是一个读取权限,因此您无需创建单独的权限请求即可获取它。你可以做这样的事情(未测试的代码,所以有可能是轻微的错误):

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

,你可以摆脱在回调新的权限要求。

+0

我应该把这段代码放在我的'MainActivity'中吗? 'String email =(String)user.getProperty(“email”);'给我空响应。 – Anupam 2013-05-02 17:32:59

+0

你可以把它放在任何活动中。 – 2013-05-02 20:56:19

+0

正如你所看到的,我在'onClick()'开放会话中,所以我需要把你的一段代码放在里面。这里会有什么'request.setCallback(/ *你的回调在这里* /);',我的回调是什么?请通过这个指导我。这对我非常有帮助。 – Anupam 2013-05-03 05:42:18

相关问题