Cómo dar permiso de publish_action en Facebook usando android

Estoy recibiendo error

java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request. 

A continuación se muestra mi código,

  public class MainActivity extends Activity { private static final String TAG = "MainFragment"; private UiLifecycleHelper uiHelper; WebView webView; Button nextButton; LoginButton authButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); authButton = (LoginButton) findViewById(R.id.authButton); authButton.setReadPermissions(Arrays.asList("email","user_birthday","basic_info")); uiHelper = new UiLifecycleHelper(this, callback); uiHelper.onCreate(savedInstanceState); } private void onSessionStateChange(final Session session, SessionState state, Exception exception) { if (state.isOpened()) { // /////// Request request = Request.newMeRequest(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { String access_token = session.getAccessToken(); String email = user.asMap().get("email") .toString(); Log.i("user", "user fname====" + user.getFirstName()); Log.i("user", "user lname=======" + user.getLastName()); Log.i("user", "user username=====" + user.getUsername()); Log.i("user", "user email333======" + (String) response.getGraphObject() .getProperty("email")); Log.i("user", "user email new222======" + email); Log.i("user", "user email new111======" + user.getProperty("email").toString()); Log.i("user", "user DOB======" + user.getBirthday()); Log.i("user", "user getName======" + user.getName()); Log.i("user", "access_token======" + access_token); } } }); Request.executeBatchAsync(request); // ///////// Log.i(TAG, "Logged in..."); authButton.setVisibility(View.VISIBLE); } else if (state.isClosed()) { Log.i(TAG, "Logged out..."); } } private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { System.out.println("statusCallBack Called"); onSessionStateChange(session, state, exception); } }; @Override public void onResume() { super.onResume(); Session session = Session.getActiveSession(); if (session != null && (session.isOpened() || session.isClosed())) { onSessionStateChange(session, session.getState(), null); } uiHelper.onResume(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); } } 

Utilice este código dentro de su actividad.

 authButton.setPublishPermissions("publish_actions", "email", "user_birthday", "basic_info"); 

Con el fin de dar permisos de publicación antes de que el usuario realmente quiere publicar algo, de cierta actividad, y sin usar "UiLifecycleHelper". Este método funcionó para mí (basado en muchas pruebas y el código en este tutoriales específicos: https://developers.facebook.com/docs/games/mobile/android-tutorial/ https://developers.facebook.com/docs/ Facebook-login / permissions / )

Primero cree la solicitud de permisos (en caso de que el usuario no la tenga):

 Session session = Session.getActiveSession(); if (PostOnFB.isChecked() && session != null && session.isOpened()) { List<String> permissions = session.getPermissions(); if (!permissions.contains("publish_actions")) { // if they choose to publish, then we request for publish permissions Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(GetUserLocationActivity.this, Arrays.asList("publish_actions")) .setDefaultAudience(SessionDefaultAudience.FRIENDS) .setCallback(newPermissionsCallback) .setRequestCode(REAUTH_ACTIVITY_CODE); session.requestNewPublishPermissions(newPermissionsRequest); } else { publishResult(); } } 

Donde "publishResult ()" es el método que se llamará después de que el usuario obtenga los permisos.

A continuación, agregue un caso para onActivityResult:

 @Override public void onActivityResult ( int requestCode, int resultCode, Intent data) { // Decide what to do based on the original request code switch (requestCode) { case .. .. .. .. .. case REAUTH_ACTIVITY_CODE : Session.getActiveSession().onActivityResult(GetUserLocationActivity.this, requestCode, resultCode, data); } } 

Finalmente implementar la devolución de llamada:

 private Session.StatusCallback newPermissionsCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { if (exception != null || !session.isOpened() || !session.getPermissions().contains("publish_actions")) { // this means the user did not grant us write permissions, so // do whatever you think } else { publishResult(); } } }; 

Eso es.

Aquí está el código de funcionamiento apenas intenta estos datos de la conexión de Facebook

Sólo cree este método en este método

  private void makeMeRequest(final Session session) { Request request = Request.newMeRequest(session, new Request.GraphUserCallback() { public void onCompleted(GraphUser user, Response response) { try{ Log.i("user", "user fname====" + user.getFirstName()); Log.i("user", "user lname=======" + user.getLastName()); Log.i("user", "user username=====" + user.getUsername()); createFacebookConnection(session); } catch (Exception e) { e.printStackTrace(); } } }); request.executeAsync(); } 

Compartir datos facebook con muro facebook

  public void createFacebookConnection(Session session) { Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); Session.StatusCallback statusCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { String message = "Facebook session status changed - " + session.getState() + " - Exception: " + exception; Log.w("Facebook test", message); if (session.isOpened() || session.getPermissions().contains("publish_actions")) { publishToWall(session); // share(session); } else if (session.isOpened()) { /* OpenRequest open = new OpenRequest(FacebookShareActivity.this).setCallback(this); ArrayList<String> permission = new ArrayList<String>(); permission.add("publish_actions"); open.setPermissions(permission); Log.w("Facebook test", "Open for publish"); session.openForPublish(open);*/ } } }; if (!session.isOpened() && !session.isClosed()&& session.getState() != SessionState.OPENING) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Log.w("Facebook test", "Open active session"); Session.openActiveSession(this, true, statusCallback); } } 
  • Android: ¿Cuál es la clase de diálogo compartido en Facebook SDK 4.x
  • Facebook - "No se pueden consultar usuarios por su nombre de usuario" solution
  • ¿Cómo verifica facebook la autenticidad de la aplicación con hash clave?
  • Parse SDK Android - API de gráficos de Facebook v2.0
  • Cómo comprobar en el uso de facebook android sdk (api gráfico)
  • Obtén la imagen de usuario de Facebook Graph-API
  • Obtener amigos taggable Facebook Android
  • Cómo obtener la identificación de correo electrónico de facebook sdk en aplicaciones Android?
  • Facebook Graph API - Obtener el cumpleaños de un usuario de facebook (sin que el usuario deba permitir permiso)
  • Cómo utilizar el parámetro de paquete de paso para la paginación en el desarrollo de facebook android
  • Obtener la foto de la portada utilizando la API de Facebook
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.