1

我已经在我的应用程序中实施了Facebook SDK,但我没有得到用户电子邮件(我想我需要设置获取用户电子邮件的权限 - 根据),但不知何故,它不适合我。我应该如何改进我的代码才能完成它?Android Facebook SDK 3.0问题,同时获取用户电子邮件

这是我的代码。

LoginScreen.java

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.facebook.*; 
import com.facebook.Session.OpenRequest; 
import com.facebook.model.*; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class LoginScreen extends Activity{ 
    public static final String[] PERMISSIONS = new String[] {"email"}; 

    public String fbId,first_name,last_name,email; 

    private Button button_fb; 

    JSONObject result; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.loginhome); 

     button_fb = (Button) findViewById(R.id.btn_signin_fb); 

     button_fb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 
       // start Facebook Login 

       Session.openActiveSession(LoginScreen.this, true, new Session.StatusCallback() { 
        // session.openForRead(new OpenRequest(LoginScreen.this).setPermissions(Arrays.asList("email"))); 
        // Callback when session changes state 

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

          // 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) { 
            GraphObject graphObject = response.getGraphObject(); 
            Log.d("graphboject",""+graphObject); 

            if (user != null) { 
             Toast.makeText(getApplicationContext(), user.getName(), Toast.LENGTH_SHORT).show(); 

             fbId = user.getId(); 
             first_name = user.getFirstName(); 
             last_name = user.getLastName(); 
             result = user.getInnerJSONObject(); 
             email = (String) user.getProperty("email"); 
             String emal = (String) response.getGraphObject().getProperty("email"); 
             // String em = (String) user.asMap().get("email"); 
             Log.d("user email", 
              (String) user.getProperty("email") + "link" 
              + user.getLink()); 

             Log.d("Fb fb_id", fbId); 
             Log.d("Fb first name", first_name); 
             Log.d("Fb last name", last_name); 
             Log.d("FB email", emal); 
             Log.d("Fb json", String.valueOf(result)); 

             // Log.d("Fb email", email); 
            } 
           } 
          }); 
         } 
        } 
       }); 
      } 
     }); 
    } 

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

我检查我的控制台上。我得到了一切,如用户名,名字,姓氏,fb_id,但我没有收到用户的电子邮件。

我应该怎么做?

我应该如何使用session.openForRead(new OpenRequest(LoginScreen.this).setPermissions(Arrays.asList("email")));?在我的代码中,我搜索了很多并查看了很多答案,但我仍然对如何在代码中实现它感到困惑。

+0

同样的问题我也有问题,但没有人回答我。 http://stackoverflow.com/questions/16332283/set-permission-for-getting-users-email-id-from-facebook-login – Anupam 2013-05-02 09:30:44

+0

我有这个链接。这可能会帮助你。我也会尝试这样的事情。 http://adilatwork.blogspot.co.uk/2013/02/facebook-android-sdk-30-requesting.html – Anupam 2013-05-02 09:41:01

+0

@Anupam感谢您分享链接..我也会试试 – iOSBee 2013-05-02 09:58:20

回答

3

您还需要在developers.facebook.com上设置'email'权限。

应用>定义>权限>用户&好友权限>(写)“电子邮件”

+0

@dwbrito它还没有工作.... – iOSBee 2013-05-03 05:12:07

4

以下工作对我来说就像一个魅力。

@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 you want. The user is 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); 
           } 
          } 
         }); 
       } 
      } 
     }); 
    } 
} 
+0

谢谢你的代码。我一直在寻找几个小时来完成这项工作,而这完全是。做得好。 – 2013-05-26 21:49:59

+0

很好,谢谢! – TharakaNirmana 2014-01-29 03:42:37

+0

此代码ID不适用于我。可以帮助任何人。 – 2015-01-31 12:46:57