在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的电子邮件)?

  • 用Android调用.NET Webservice
  • 使用bundle将数据从一个活动传递到另一个活动 - 不在第二个活动中显示
  • 自定义序列化程序 - 使用GSON的反序列化程序列表BasicNameValuePairs
  • 我怎样才能反序列化一个JSON对象,但保持一个特定的字段作为一个string,而不是一个嵌套的对象?
  • 用于POST方法的意外响应代码500
  • 如何处理Android上的大型JSON对象
  • 从JSON填充Listview
  • 错误org.json.JSONException:PROJECT_NAME没有值这是我的json
  • 您需要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()