Solicitando un permiso de Facebook rechazado de nuevo sin aparecer el diálogo de Facebook dos veces

¿Cuál es la forma correcta de volver a solicitar el permiso de Facebook anteriormente negado?

Digamos que una aplicación solicita un permiso de lectura como user_photos . El usuario rechaza esto para la tarea A.

Ellos proceden a utilizar la aplicación, pero se encuentran con la tarea B que requiere el mismo permiso user_photos , pero esta vez el usuario está dispuesto a proporcionar el permiso de Facebook.

Teniendo en cuenta este comportamiento, vuelvo a solicitar al usuario este permiso y, con el SDK de Android Facebook, se realiza con la API requestNewReadPermissions :

  session.requestNewReadPermissions( new Session.NewPermissionsRequest(this,PERMISSION_USER_PHOTOS)); 

Sin embargo, esta llamada, sin embargo, sólo parece funcionar después de una sesión de Facebook se ha abierto (por ejemplo, en el Session.StatusCallback ) así:

 public void call(Session session, SessionState state, Exception e) { if (session.isOpened()) { if (session.getDeclinedPermissions().contains("user_photos")) { session.requestNewReadPermissions(new Session.NewPermissionsRequest(this, "user_photos")); return; } // ... } else if (session.isClosed()) { // ... } } 

Dado que este permiso ya fue solicitado y denegado anteriormente, la primera vez que abra la sesión de Facebook con el permiso necesario, así:

 if (session != null && !session.isOpened() && !session.isClosed()) { session.openForRead(new Session.OpenRequest(this) .setPermissions(PERMISSION_USER_PHOTOS) .setCallback(this)); } 

Facebook lanza un spinner y un diálogo nativo, pero inmediatamente regresa (sin mostrar la ventana de permisos al usuario), diciendo que se rechazó el permiso (porque esto no se consideró una "re-solicitud").

A continuación, procede a la devolución de llamada de estado de sesión donde, (como se muestra en el fragmento de código anterior) , compruebo si se rechazó el permiso y solicito un nuevo permiso de lectura. Se vuelve a lanzar un spinner con el cuadro de diálogo nativo FB, pero ahora finalmente muestra la ventana de permisos de permisos nativos FB, dando al usuario una opción para aceptar o rechazar de nuevo.

Mis preguntas:

  1. Si sé que el permiso ya fue rechazado una vez, ¿es posible abrir la sesión con un "nuevo" permiso de lectura? No puedo encontrar una manera de abrir una sesión de Facebook en cualquiera de las variantes de session.openForRead() con este "nuevo permisos".
  2. Si 1. no es posible, ¿hay una manera de evitar toda la danza de:
    spinner ↣ popup (pero retorno inmediato) ↣ spinner ↣ mostrar nueva solicitud popup

No utilizo el "botón de Facebook", sino el método de interfaz de usuario personalizado que se recomienda en los documentos de FB. En concreto, estoy utilizando un fragmento con el UiLifecycleHelper para administrar mis llamadas de ciclo de vida de Facebook. Aquí está el código de mi FB fragmento de ciclo de vida (si es relevante para resolver el problema):

 public abstract class FacebookLifecycleFragment extends BaseFragment implements Session.StatusCallback { private UiLifecycleHelper _uiLifecycleHelper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _uiLifecycleHelper = new UiLifecycleHelper(getActivity(), this); _uiLifecycleHelper.onCreate(savedInstanceState); } @Override public void onResume() { super.onResume(); _uiLifecycleHelper.onResume(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); _uiLifecycleHelper.onActivityResult(requestCode, resultCode, data); } @Override public void onPause() { super.onPause(); _uiLifecycleHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); _uiLifecycleHelper.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); _uiLifecycleHelper.onSaveInstanceState(outState); } } 

En consecuencia, PublishFbPhotoFragment fragmentos de LoginFbFragment , PublishFbPhotoFragment etc. que realizan la solicitud de "solicitud de permiso + acción requerida en Facebook" en su inicio (o un desencadenador de un botón en ese fragmento).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.