android - 在 Android 中登录后获取 facebook 电子邮件

标签 android json facebook email

这是我实现连接的代码。

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"}

我的问题是如何获取用户的电子邮件(他登录 Facebook 所用的电子邮件)?

最佳答案

您需要email 权限才能读取用户的电子邮件地址。 这将在来自 [uid]me 请求的 json 响应中添加一个电子邮件标记。

电子邮件

Provides access to the user's primary email address in the email property. Do not spam users. Your use of email must comply both with Facebook policies and with the CAN-SPAM Act.

来源:Permissions

关于android - 在 Android 中登录后获取 facebook 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064472/

相关文章:

Facebook 发送按钮返回状态代码 200

javascript - 如何制作像 Facebook 或 Twitter 这样的分享按钮

python - 解析requests.post对象

javascript - JS 循环遍历 json 对象

ios - 如何将 header 添加到 dataTaskWithUrl?

android - 如果已经从 Android 中的 FB SDK 获得访问 token ,如何在 WebView 中登录 facebook

android - 在 IntelliJ 中,如何设置 Android API 级别

Retrofit 响应中的 Android 空指针异常

android - 带参数的导航组件 .popBackStack()

android - 如何使用 Kotlin 在 Android 上的 Apollo GraphQL 中创建 JSON CustomTypeAdapter