Facebook login No se puede pasar un permiso de publicación o gestión (correo electrónico) a una solicitud de autorización de lectura

Tengo un clic de botón para iniciar sesión en Facebook, pero a veces este código no puede funcionar. Throw exception: Causado por:

com.facebook.FacebookException: Cannot pass a publish or manage permission (email) to a request for read authorization 

Este es el código de mi actividad:

 public class FacebookLoginActivity extends Activity { private final static String TAG="FB"; private static final List<String> PERMISSIONS=Arrays.asList("email", "user_likes", "user_status"); private Session.StatusCallback statusCallback=new SessionStatusCallback(); private GraphUser user = null; private Bundle bundle; private Intent myIntent; private Session session; private static FacebookLoginActivity instance=new FacebookLoginActivity(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(bundle==null){ bundle=new Bundle(); } Log.v(TAG, "in FB onCreate method"); myIntent = this.getIntent(); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); String action = ClientUtil.getElementValue("action"); Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); session=openActiveSession(this, true, PERMISSIONS); onClickLogin(); } public void onClickLogin() { Log.v(TAG, "click login btn"); session = Session.getActiveSession(); if (!session.isOpened() && !session.isClosed()) { OpenRequest openRequest=new Session.OpenRequest(this); openRequest.setPermissions(PERMISSIONS); openRequest.setCallback(statusCallback); openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); session.openForPublish(openRequest); } else { Log.v(TAG, "open active session"); Session.openActiveSession(this, true, statusCallback); } } @Override public void onStart() { super.onStart(); Log.v(TAG, "onStart method to add fb Callback"); Session.getActiveSession().addCallback(statusCallback); } @Override public void onStop() { super.onStop(); Log.v(TAG, "onStop method to remove fb callback"); Session.getActiveSession().removeCallback(statusCallback); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.v(TAG, "onActivityResult method to call Fb Session"); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Session session=Session.getActiveSession(); Session.saveSession(session, outState); } private static Session openActiveSession(Activity activity, boolean allowLoginUI, List<String> permissions) { OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions); Session session = new Session.Builder(activity).build(); if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) { Session.setActiveSession(session); session.openForPublish(openRequest); return session; } return null; } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, Exception exception) { Log.v(TAG, "in StatusCallback call method exception is:"+ exception); Log.v(TAG, "session state is:"+session.isOpened()); if(user != null) { Log.v(TAG, "fb user is exist todo login yyy"); login(); finish(); Log.v(TAG, "finish fb activity"); return; } if(session.isOpened()) { Log.v(TAG, "session is opened to call FB Request"); Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser me, Response response) { Log.v(TAG, "in GraphUserCallback onCompleted method"); Log.v(TAG, "GraphUser has value:"+(user!=null)); if(me != null) { user=me; login(); } finish(); Log.v(TAG, "finish fb activity"); } }); }else{ Log.v(TAG, "session is not open"); if(exception !=null && exception.toString().contains("Canceled")){ Log.v(TAG, "cancle login"); bundle.putInt("code", RespondCode.CANCLE); myIntent.putExtras(bundle); setResult(Activity.RESULT_OK, myIntent); finish(); } } } } } 

No puede llamar a openForPublish a menos que su aplicación ya haya recibido permisos básicos primero.

Separa tu lista PERMISSIONS en PERMISSIONS_READ y PERMISSIONS_PUBLISH y coloca "email" en el lado PUBLISH. A continuación, llame a openForRead y, a continuación, requestNewPublishPermissions cuando su sesión está abierta.

Aquí está la cosa que usted debe hacer, él me ayudó en conseguir mi requisito hecho:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin = (Button) findViewById(R.id.logIn); mLogin.setOnClickListener(this); } @Override public void onClick(View v) { 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()) { // 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 Builder(MainActivity.this).build(); Session.setActiveSession(session); session.openForPublish(op); } } public void call(Session session, SessionState state, Exception exception) { } @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) { TextView welcome = (TextView) findViewById(R.id.welcome); welcome.setText("Hello " + user.getName() + "!"); access_token = session .getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); System.out .println("Facebook Access token: " + access_token); System.out.println("First Name:" + firstName); System.out.println("FB USER ID: " + fb_user_id); } } }); } } }); } } 

Pruebe el código anterior, es justo lo que quería tener.

  • No se puede resolver el tipo android.support.v4.app.Fragment. Se hace referencia indirectamente a los archivos .class requeridos, Facebook
  • SDK de Android facebook como JAR
  • ¿Cómo usar plugins específicos de plataforma en Cordova app dev workflow?
  • ¿Es posible generar un enlace de "compartir en Facebook" que abra la aplicación nativa de Facebook en Android / iOS / mobile en lugar del diálogo de compartir web?
  • Facebook amigo recolector muestra SDK no funciona Android
  • Error de carga de video de Android Facebook con la API de Android 4+
  • Realizar solicitudes REST autorizadas (a través de facebook) a mi servidor node.js en una aplicación PhoneGap
  • ¿Cómo publicar la actualización en la página de Facebook automáticamente por hora programada? Usando android
  • No has iniciado sesión. Inicia sesión e inténtalo de nuevo.
  • Android que abre la aplicación de Facebook en una publicación específica
  • Reproducción automática de video como facebook, Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.