2013-05-02 107 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

相關問題