Ejmedina
Ejmedina

Reputation: 509

Facebook Sdk for Android not asking for email permission

I'm implementing a Login flow in my Android App usign facebook SDK following their tutorials and documentation as long as several answers here in StackOverflow.

I have a UserRegistrationActivity with a Button(not a "LoginButton"). I think I am asking for the right permissions(basic_info,email). I get a facebook dialog asking for permissions but email is not listed among them so when I get my access_token, I can't access user email server side.

My code:

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();
    }
}

}

Upvotes: 0

Views: 3434

Answers (3)

alambel
alambel

Reputation: 11

A quicker way to request email permission would be to use the optional third parameter of the Session.openActiveSession() Call as follows:

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

Upvotes: 1

Ming Li
Ming Li

Reputation: 15662

It's not asking for "email" permissions because it's always going to the "else" case, where it's calling the openActiveSession method with an empty permission list (which only gets "basic_info" by default).

Try changing your onClickLogin to this:

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));
}

Upvotes: 2

Usman Kurd
Usman Kurd

Reputation: 7023

Use the following code this will work with you

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();


                                      }
                                  }
                              });
                  }
              }
          });
      }
  }

Upvotes: 0

Related Questions