在Androidlogin后获取Facebook电子邮件

这是我的代码实现连接。

import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.widget.ProgressBar; import android.widget.TextView; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.AsyncFacebookRunner.RequestListener; import com.facebook.android.DialogError; import com.facebook.android.Facebook; import com.facebook.android.Facebook.DialogListener; import com.facebook.android.FacebookError; import com.facebook.android.Util; public class FacebookConnect extends Activity{ public static final String TAG = "FACEBOOK"; private Facebook mFacebook; public static final String APP_ID = "XXX"; private AsyncFacebookRunner mAsyncRunner; private static final String[] PERMS = new String[] { "read_stream" }; private SharedPreferences sharedPrefs; private Context mContext; private TextView username; private ProgressBar pb; String fbId, fbName, fbEmail; public void setConnection() { mContext = this; mFacebook = new Facebook(APP_ID); mAsyncRunner = new AsyncFacebookRunner(mFacebook); } public void getID(TextView txtUserName, ProgressBar progbar) { username = txtUserName; pb = progbar; if (isSession()) { Log.d(TAG, "sessionValid"); mAsyncRunner.request("me", new IDRequestListener()); } else { // no logged in, so relogin Log.d(TAG, "sessionNOTValid, relogin"); mFacebook.authorize(this, PERMS, new LoginDialogListener()); } } public boolean isSession() { sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); String access_token = sharedPrefs.getString("access_token", "x"); Long expires = sharedPrefs.getLong("access_expires", -1); Log.d(TAG, access_token); if (access_token != null && expires != -1) { mFacebook.setAccessToken(access_token); mFacebook.setAccessExpires(expires); } return mFacebook.isSessionValid(); } private class LoginDialogListener implements DialogListener { @Override public void onComplete(Bundle values) { Log.d(TAG, "LoginONComplete"); String token = mFacebook.getAccessToken(); long token_expires = mFacebook.getAccessExpires(); Log.d(TAG, "AccessToken: " + token); Log.d(TAG, "AccessExpires: " + token_expires); sharedPrefs = PreferenceManager .getDefaultSharedPreferences(mContext); sharedPrefs.edit().putLong("access_expires", token_expires).commit(); sharedPrefs.edit().putString("access_token", token).commit(); mAsyncRunner.request("me", new IDRequestListener()); } @Override public void onFacebookError(FacebookError e) { Log.d(TAG, "FacebookError: " + e.getMessage()); } @Override public void onError(DialogError e) { Log.d(TAG, "Error: " + e.getMessage()); } @Override public void onCancel() { Log.d(TAG, "OnCancel"); } } private class IDRequestListener implements RequestListener { @Override public void onComplete(String response, Object state) { try { Log.d(TAG, "IDRequestONComplete"); Log.d(TAG, "Response: " + response.toString()); JSONObject json = Util.parseJson(response); fbId = json.getString("id"); fbName = json.getString("name"); //fbEmail = json.getString("email"); FacebookConnect.this.runOnUiThread(new Runnable() { public void run() { username.setText("Welcome: " + name + "\n ID: " + fbId); pb.setVisibility(ProgressBar.GONE); } }); } catch (JSONException e) { Log.d(TAG, "JSONException: " + e.getMessage()); } catch (FacebookError e) { Log.d(TAG, "FacebookError: " + e.getMessage()); } } @Override public void onIOException(IOException e, Object state) { Log.d(TAG, "IOException: " + e.getMessage()); } @Override public void onFileNotFoundException(FileNotFoundException e, Object state) { Log.d(TAG, "FileNotFoundException: " + e.getMessage()); } @Override public void onMalformedURLException(MalformedURLException e, Object state) { Log.d(TAG, "MalformedURLException: " + e.getMessage()); } @Override public void onFacebookError(FacebookError e, Object state) { Log.d(TAG, "FacebookError: " + e.getMessage()); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { mFacebook.authorizeCallback(requestCode, resultCode, data); } } 

作为回应,我得到一个JSON。 例:

 08-15 14:22:42.160: DEBUG/FACEBOOK(1258): Response: {"id":"3159628280","name":"Peter Black","first_name":"Peter","last_name":"Black","link":"http:\/\/www.facebook.com\/Peter.Black","username":"Peter.Black","gender":"male","timezone":3,"locale":"bg_BG","verified":true,"updated_time":"2011-08-14T08:42:59+0000"} 

我的问题是我怎样才能得到用户的电子邮件(他login到Facebook的电子邮件)?

Solutions Collecting From Web of "在Androidlogin后获取Facebook电子邮件"

您需要email许可才能阅读用户的电子邮件地址。 这将添加一个电子邮件标签在你的json响应从[uid]me请求。

电子邮件

提供对电子邮件属性中用户的主要电子邮件地址的访问。 不要垃圾邮件用户。 您使用电子邮件必须符合Facebook政策和CAN-SPAM法案。

来源: 权限

点击loginbutton时执行此操作:

  OpenRequest openRequest = new OpenRequest(this); List<String> readPermissions = new ArrayList<String>(); readPermissions.add("email"); openRequest.setPermissions(readPermissions); openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); openRequest.setCallback(statusCallback); session.openForRead(openRequest); 

在Facebook SDK 3.0.x中检索电子邮件的另一个select是使用这个开源库:

Android的简单的Facebook
https://github.com/sromku/android-simple-facebook

  • 首先,使用此权限

     Permissions.EMAIL 
  • 然后,login

     mSimpleFacebook.login(MainActivity.this); 
  • 然后,获取configuration文件

     mSimpleFacebook.getProfile(new OnProfileRequestAdapter() { @Override public void onComplete(Profile profile) { String id = profile.getId(); String firstName = profile.getFirstName(); String birthday = profile.getBirthday(); String email = profile.getEmail(); String bio = profile.getBio(); // ... and many more properties of profile ... } }); 

完整的例子在这里解释,包括权限的东西和其他简化的方法(如:发布饲料,朋友和更多…)

在调用Session.openActiveSession之前,请执行以下操作获取权限添加:

 List<String> permissions = new ArrayList<String>(); permissions.add("email"); 

Session.openActiveSession()的最后一个参数应该是权限。 现在你可以访问user.getProperty("email").toString()