android - 适用于 Android 的 Facebook SDK 3.7 请求电子邮件权限

标签 android facebook email facebook-android-sdk facebook-sdk-3.0

我正在使用适用于 Android 的 Facebook SDK 来允许用户注册和使用应用程序。我想获取有关用户的一些基本信息,例如用户名和电子邮件。无论如何,我遇到了问题,因为在尝试获取用户电子邮件时出现空指针异常。

String email = user.getProperty("email").toString();

我假设我收到此错误是因为我没有请求电子邮件许可。我该怎么做?

这是完整代码:

public class RegisterActivity extends ActionBarActivity{

Button btnFacebook;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    getSupportActionBar().hide();

    btnFacebook = (Button) findViewById(R.id.btn_facebook);


    btnFacebook.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Log.d("FACEBOOK", "Prije sesije");
            // start Facebook Login
                        Session.openActiveSession(RegisterActivity.this, true, new Session.StatusCallback() {
                            // callback when session changes state
                            @SuppressWarnings("deprecation")
                            @Override
                            public void call(Session session, SessionState state,
                                    Exception exception) {
                                Log.d("FACEBOOK", "U call");
                                if(session.isOpened()){                     

                                    Log.d("FACEBOOK", "ako je sesija otvorena");

                                    // make request to the /me API
                                    Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                                        @Override
                                        public void onCompleted(GraphUser user, Response response) {
                                            Log.d("FACEBOOK", "onCompleted");

                                            if(user != null){
                                                Log.d("FACEBOOK", "user razlicit od null");
                                                 String email = user.getProperty("email").toString();
                                                Toast.makeText(getApplicationContext(), "Ime "+user.getUsername().toString()+ "Email "+ email , 
                                                        Toast.LENGTH_SHORT).show();

                                                String userId = user.getId();


                                                //new DownloadImageTask(ivProfile).execute("http://graph.facebook.com/"+userId+"/picture?type=large");



                                                Log.d("ID", userId);



                                            }
                                            Log.d("ID", user.getId());


                                        }
                                    });
                                }
                                Log.d("FACEBOOK", "nije u sesisji");


                            }

                        });

        }
    });

}

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

最佳答案

先获取权限

private static final List<String> PERMISSIONS = Arrays.asList(
        "email","user_location");

获取用户信息的方法

      Session.openActiveSession(RegisterActivity.this, true, new Session.StatusCallback() {

        // callback when session changes state
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            /*
             * Session.getActiveSession().onActivityResult(activity1,64206,
             * -1,activity1.getIntent());
             */

            if (session.isOpened()) {

                List<String> permissions = session.getPermissions();
                if (!isSubsetOf(PERMISSIONS, permissions)) {
                    Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
                            RegisterActivity.this, PERMISSIONS);
                    session.requestNewReadPermissions(newPermissionsRequest);
                    return;
                }
                // make request to the /me API
                Request.newMeRequest(session, new GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        // TODO Auto-generated method stub
                        Log.d("",""+user);  
                        try {

                            name=user.getName();
                            email=user.getProperty("email").toString();
                            location=(user.getLocation().getProperty("name").toString());

                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }
                }).executeAsync();

            }
        }
    });

isSubsetof 方法

private boolean isSubsetOf(Collection<String> subset,
        Collection<String> superset) {
    for (String string : subset) {
        if (!superset.contains(string)) {
            return false;
        }
    }
    return true;
}

把这段代码放在onActivityResult

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

    Log.d("Activity result","  "+requestCode+"   "+resultCode+"    "+data.toString());
    Session.getActiveSession().onActivityResult(this, requestCode,
            resultCode, data);
}

在 list 中加入Internet权限

   <uses-permission android:name="android.permission.INTERNET" />

在 list 中声明Facebook 登录 Activity

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/app_id" />

关于android - 适用于 Android 的 Facebook SDK 3.7 请求电子邮件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22077043/

相关文章:

c# - 如何在 asp.net C# 中使用启用两因素身份验证的 office365 电子邮件帐户发送电子邮件?

android - 用于安卓的 FFmpeg 包装器

android - 如何使用 Sugar ORM 的 count() 方法?

javascript - FB.login 有效但弹出窗口未关闭

node.js - 错误: read ECONNRESET when working with large data in Firebase Cloud functions

facebook - 带有 webhook 的 Facebook Realtime API 是否也适用于页面评论和用户帖子?

java - 已发送带有确认链接的 PHP 电子邮件,但确认链接不起作用

java - 用java发送HTML文本消息到手机

java - Java TCP/IP 套接字如何向应用程序报告传输成功或失败?

java - 对包含带数字的字符串的文件名数组进行排序