【问题标题】:Facebook Sdk for Android not asking for email permission适用于 Android 的 Facebook Sdk 不要求电子邮件许可
【发布时间】:2013-10-17 20:41:00
【问题描述】:

我正在我的 Android 应用程序中实现登录流程,使用 facebook SDK 按照他们的教程和文档,只要 StackOverflow 中的几个答案。

我有一个带有按钮的 UserRegistrationActivity(不是“登录按钮”)。 我想我要求正确的权限(基本信息,电子邮件)。 我收到一个询问权限的 Facebook 对话框,但其中未列出电子邮件,因此当我获得 access_token 时,我无法访问用户电子邮件服务器端。

我的代码:

package com.test.user;

import java.util.Arrays;

import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import com.facebook.Session;
import com.facebook.SessionState;
import com.test.user.domain.User;
import com.test.user.services.UserLoginService;

public class UserRegistrationActivity extends SherlockActivity implements  OnClickListener,ConnectionCallbacks,
OnConnectionFailedListener  {
private static final String TAG = "UserRegistrationActivity";
private static final int REQUEST_CODE_RESOLVE_ERR = 9000;
private ProgressDialog mConnectionProgressDialog;
private PlusClient mPlusClient;
private ConnectionResult mConnectionResult;
private Session session;
private Session.StatusCallback statusCallback =
new SessionStatusCallback();
SharedPreferences settings;
UserRegistrationActivity _activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_user_registration);
    settings = getSharedPreferences(TestApplication.PREFS_NAME, 0);

    setupActionBar();
    _activity = this;
}

public void onClickLogin(View v) {
    getSherlock().setProgressBarIndeterminateVisibility(true);
    Session session = Session.getActiveSession();
    if (session != null && !session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(this)
        .setPermissions(Arrays.asList("basic_info","email"))
        .setCallback(statusCallback));
        } else {
        Session.openActiveSession(this, true, statusCallback);
    }
}

@Override
protected void onResume() {
    super.onResume();

}
private void setupActionBar() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case android.R.id.home:
        // app icon in action bar clicked; go home
        finish();
        return true;

        default:
        return super.onOptionsItemSelected(item);
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.user_registration, (com.actionbarsherlock.view.Menu) menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public void onDisconnected() {
    Log.d(TAG, "disconnected");
}
@Override
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
    if(requestCode == 2){
        if(responseCode ==RESULT_OK){
            if(intent.getExtras().containsKey("user_id")){
                String userId = intent.getExtras().getString("user_id");
                Intent returnIntent = new Intent();
                returnIntent.putExtra("user_id", userId);
                setResult(RESULT_OK,returnIntent);
                getSherlock().setProgressBarIndeterminateVisibility(true);
                finish();
                }else{
                getSherlock().setProgressBarIndeterminateVisibility(true);
            }
        }

    }else{
        Session.getActiveSession().onActivityResult(this, requestCode, responseCode, intent);
    }

}
private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if(!TextUtils.isEmpty(session.getAccessToken())){
            SharedPreferences.Editor editor = settings.edit();
            editor.putString("user_token","@FB@:"+session.getAccessToken());
            editor.putString("user_token_type","FACEBOOK");
            // Commit the edits!
            editor.commit();

            new UserLoginService(_activity).execute("@FB@:"+session.getAccessToken());

        }
    }
}
public void onResultFromAsyncTask(User result) {
    if(result!=null){
        Intent returnIntent = new Intent();
        returnIntent.putExtra("user_id", result.getId());
        setResult(RESULT_OK,returnIntent);
        getSherlock().setProgressBarIndeterminateVisibility(true);
        finish();
    }
}

}

【问题讨论】:

    标签: android facebook permissions facebook-login


    【解决方案1】:

    它不要求“电子邮件”权限,因为它总是会出现“其他”情况,即使用空权限列表调用 openActiveSession 方法(默认情况下仅获取“basic_info”)。

    尝试将您的 onClickLogin 更改为:

    Session session = Session.getActiveSession();
    if (session == null) {
        session = new Session(this);
        Session.setActiveSession(session);
    }
    if (!session.isOpened() && !session.isClosed())) {
        session.openForRead(new Session.OpenRequest(this)
          .setPermissions(Arrays.asList("basic_info","email"))
          .setCallback(statusCallback));
    }
    

    【讨论】:

      【解决方案2】:

      请求电子邮件权限的更快方法是使用 Session.openActiveSession() 调用的可选第三个参数,如下所示:

      Session.openActiveSession(getActivity(), true, Arrays.asList("basic_info","email") ,new Session.StatusCallback() {...});
      

      【讨论】:

      • 这才是真正的解决方案!
      【解决方案3】:

      使用以下代码,这将适用于您

      private void FaceBookSignIn()
         {
         facebookBtn.setOnClickListener(new View.OnClickListener() {
      
         @Override
         public void onClick(View arg0) {
             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(YourActivity.this, false, 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) {
      
      
      
                                                       UserID=user.getId();
                                                       firstName=user.getFirstName();
                                                       Lastname=user.getLastName();
                                                       Gender=user.getProperty("gender").toString();
                                                       Email=user.getProperty("email").toString();
                                                       DateofBirth=user.getBirthday();
      
      
      
                                                    }
                                                }
                                            });
                                }
                            }
                        });
                    }
                  // Do whatever u want. User has 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 Session.Builder(SignIn_Rewards.this).build();
                  Session.setActiveSession(session);
                  session.openForPublish(op);
              }
      
      
      
         }
        }) ;
      
            }
      
        @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) {
      
                                                fromFB=true;
      
                                               UserID=user.getId();
                                               firstName=user.getFirstName();
                                               Lastname=user.getLastName();
                                               Gender=user.getProperty("gender").toString();
                                               Email=user.getProperty("email").toString();
                                               DateofBirth=user.getBirthday();
      
      
                                            }
                                        }
                                    });
                        }
                    }
                });
            }
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多