2012-11-03 98 views
19

嗨我正在玩新的Facebook Android SDK。我無法弄清楚的一件事是我該如何索要電子郵件地址。我試着跟隨,但它返回除電子郵件地址以外的所有字段的值。我想我可能需要單獨詢問電子郵件地址的權限,但不知道如果我使用LoginFragment,我該怎麼做。使用新的Facebook Android SDK訪問用戶電子郵件

Request request = Request.newMeRequest(session, new GraphUserCallback() { 

    @Override 
    public void onCompleted(GraphUser user, Response response) { 
     profilePictureView.setUserId(user.getId()); 
     userNameView.setText(user.getName()); 
    } 
}); 

String NAME = "name"; 
String ID = "id"; 
String PICTURE = "picture"; 
String EMAIL = "email"; 
String FIELDS = "fields"; 
String REQUEST_FIELDS = TextUtils.join(",", new String[] { 
    ID, NAME, PICTURE, EMAIL 
}); 

Bundle parameters = new Bundle(); 
parameters.putString(FIELDS, REQUEST_FIELDS); 
request.setParameters(parameters); 
Request.executeBatchAsync(request); 

任何幫助表示讚賞。 謝謝

+0

必須指定,而不是提「新的Facebook Android SDK中」的SDK版本,我想 – NarendraJi

回答

24

當您打開會話時,請嘗試在權限列表中包含「電子郵件」。

如果使用LoginButton,做這樣的事情:

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

如果是自己開的會議,這樣做:

session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("email"))); 

您可以使用請求/權限實驗:https://developers.facebook.com/tools/explorer/

使用這些權限成功登錄後,再次嘗試請求,包括電子郵件字段。

+0

如果您使用的SDK內置的LoginFragment你怎麼可以通過額外的領域? –

+0

LoginFragment也有一個setReadPermissions方法。 – rightparen

+1

Iam請求emial爲Session.OpenRequest openRequest = null; \t \t \t openRequest = new Session.OpenRequest(LoginActivity.this); \t \t \t如果(openRequest!= NULL){ \t \t \t \t openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); (數組。)。asList( 「電子郵件」)); \t \t \t \t mCurrentSession.openForRead(openRequest); \t \t \t}但我對Log.d越來越空( 「用戶電子郵件」, \t \t \t \t \t \t \t \t \t \t(字符串)user.getProperty( 「電子郵件」) \t \t \t \t \t \t \t \t \t \t); – user1767260

1

我找到了解決辦法:和它的作品

LoginFragment loginFragment = new LoginFragment() { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
       View v = super.onCreateView(inflater, container, savedInstanceState); 
       setReadPermissions(Arrays.asList("email")); 
       return v; 
      } 
     }; 
30

執行以下操作:

通過電子郵件設置權限如上訪問後: user.asMap()得到(「電子郵件」 ));

看到,如果你正在使用com.facebook.widget.LoginButton你應該設置權限,這個片段,Facebook的電子郵件返回後下方

@Override 
protected void onSessionStateChange(SessionState state, Exception exception) { 

    // user has either logged in or not ... 
    if (state.isOpened()) { 
     // make request to the /me API 
     Request request = Request.newMeRequest(this.getSession(), 
       new Request.GraphUserCallback() { 
        // callback after Graph API response with user object 

        @Override 
        public void onCompleted(GraphUser user, 
          Response response) { 
         // TODO Auto-generated method stub 
         if (user != null) { 
          TextView etName = (TextView) findViewById(R.id.etName); 

          etName.setText(user.getName() + "," 
            + user.getUsername() + "," 
            + user.getId() + "," + user.getLink() 
            + "," + user.getFirstName()+ user.asMap().get("email")); 

         } 
        } 
       }); 
     Request.executeBatchAsync(request); 
    } 
} 
+2

我們是否可以使用此方法獲取個人資料圖片? (我的意思是使用Request類) – ecem

+7

我嘗試設置讀取權限,如下所示:'authButton.setReadPermissions(Arrays.asList(「email」));'然後嘗試像這樣訪問電子郵件'user.asMap() .get(「email」),但總是返回null。 – toobsco42

+1

請參閱Facebook的報告[此處](https://developers.facebook.com/bugs/298946933534016)。 –

15

的例子。這裏是工作代碼:

LoginButton authButton = findViewById(R.id.sign_in_facebook); 
    List<String> permissions = new ArrayList<>(); 
    permissions.add("public_profile"); 
    permissions.add("email"); 
    permissions.add("user_birthday"); 
    authButton.setReadPermissions(permissions);` 

編輯 Facebook的更新,它的SDK,這有利於工作吧。從4.x版開始(changelog),您可以在需要它的不同位置初始化sdk,而不是以非常簡單的方式使用它。下面是示例:

FacebookSdk.sdkInitialize(getActivity().getApplicationContext()); 
CallbackManager callbackManager = CallbackManager.Factory.create(); 
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) { 
            String email = object.optString("email"); 
            String uid = object.optString("id"); 
            loginPresenter.loginBySocial(email, uid); 
           } 
          }); 
        Bundle parameters = new Bundle(); 
        parameters.putString("fields", "email"); 
        request.setParameters(parameters); 
        request.executeAsync(); 
       } 

       @Override 
       public void onCancel() { 
        //your code 
       } 

       @Override 
       public void onError(FacebookException exception) { 
        //your code 
       } 
      }); 
+1

我從過去幾天開始搜索...您的回答幫助我thanx –

+1

@vovaxo我是Android新手FB整合。完成此操作後,我可以在哪裏獲取用戶的電子郵件? – Tejas

+2

@Teju有你應該實現'Session.StatusCallback'的接口。內部回調方法:'@Override public void call(Session session,SessionState sessionState,Exception e)if(sessionState.isOpened()&& session.isOpened()){ Request me = Request.newMeRequest(session,new Request.GraphUserCallback(){ @覆蓋 公共無效onCompleted(graphUser graphUser,響應響應){ 字符串email = graphUser.asMap()得到( 「電子郵件」)的toString();} }); me.executeAsync(); } }' –

相關問題