Estaba revisando el documento oficial sobre el nuevo modelo de permisos en Android M. Habla sobre la shouldShowRequestPermissionRationale()
función que regresa true
si la aplicación ha solicitado este permiso anteriormente y el usuario rechazó la solicitud. Si el usuario rechazó la solicitud de permiso en el pasado y eligió la opción No volver a preguntar, este método regresa false
.
Pero, ¿cómo podemos diferenciar entre los siguientes dos casos?
Caso 1 : la aplicación no tiene permiso y no se le ha pedido permiso al usuario antes. En este caso, shouldShowRequestPermissionRationale () devolverá false porque es la primera vez que le preguntamos al usuario.
Caso 2 : el usuario ha denegado el permiso y ha seleccionado "No volver a preguntar", en este caso también shouldShowRequestPermissionRationale () devolverá false.
Me gustaría enviar al usuario a la página de configuración de la aplicación en el Caso 2. ¿Cómo hago para diferenciar estos dos casos?
fuente
shouldShowRequestPermissionRationale()
devoluciones son falsas en este caso, lo que perjudicará a cualquier código que se base en un indicador de "he preguntado antes".permissions
Android. github.com/android/permissions-samplesRespuestas:
Después de M Vista previa 1, si el cuadro de diálogo se muestra por primera vez , no hay una casilla de verificación Nunca preguntar de nuevo .
Si el usuario rechaza la solicitud de permiso, habrá una casilla de verificación Nunca preguntar de nuevo en el cuadro de diálogo de permisos la segunda vez que se solicite el permiso.
Entonces la lógica debería ser así:
Pedir permiso:
Verifique si el permiso fue denegado o concedido
onRequestPermissionsResult
.Si el permiso fue denegado anteriormente, esta vez habrá una casilla de verificación Nunca preguntar nuevamente en el cuadro de diálogo de permisos.
Llame
shouldShowRequestPermissionRationale
para ver si el usuario marcó No preguntar nunca más .shouldShowRequestPermissionRationale
El método devuelve falso solo si el usuario seleccionó Nunca preguntar de nuevo o la política del dispositivo prohíbe que la aplicación tenga ese permiso:Por lo tanto, no tendrá que rastrear si un usuario marcó Nunca preguntar de nuevo o no.
fuente
context
enActivityCompat.shouldShowRequestPermissionRationale(...)
el parámetro es en realidad de tipoActivity
. Puede que no los afecte a todos, pero en mi caso sí.should
en la devolución de llamada Y guardar su contravalor en NVM solo para saber si necesito volver a solicitar la solicitud la próxima vez que se abra la aplicación! ... wow (facepalm) ... ¿fue demasiado difícil hacer que solo una llamada devolviera una enumeración de estado?Tuve el mismo problema y lo resolví. Para simplificar la vida, escribí una clase util para manejar los permisos de tiempo de ejecución.
Y los métodos PreferenceUtil son los siguientes.
Ahora, todo lo que necesita es usar el método checkPermission con los argumentos adecuados.
Aquí hay un ejemplo,
Recibirá devolución de llamada en onPermissionAsk para el caso 1 y onPermissionDisabled para el caso 2.
Feliz codificación :)
fuente
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
no es más queYourActivity.this
.context
estás usando?shouldShowRequestPermissionRationale(permission)
no existe enandroid.content.Context
. está en ActivityCompatACTUALIZAR
Creo que la respuesta de CanC a continuación es la correcta que debe seguirse. La única forma de saberlo con certeza es verificar esto en la devolución de llamada onRequestPermissionResult usando shouldShowPermissionRationale.
==
Mi respuesta original:
La única manera que he encontrado es hacer un seguimiento por su cuenta de si es la primera vez o no (por ejemplo, usando preferencias compartidas). Si no es la primera vez, entonces use
shouldShowRequestPermissionRationale()
para diferenciar.Ver también: Android M: verifique el permiso de tiempo de ejecución: ¿cómo determinar si el usuario marcó "Nunca preguntar de nuevo"?
fuente
Según tengo entendido, shouldShowRequestPermissionRationale () ejecuta una serie de casos de uso bajo el capó, y notifica a la aplicación si mostrar o no una explicación sobre los permisos solicitados.
La idea detrás de los permisos de Tiempo de ejecución es que la mayoría de las veces, el usuario dirá Sí a la solicitud de permiso. De esta forma, el usuario tendrá que hacer solo un clic. Por supuesto, la solicitud debe usarse en el contexto correcto, es decir, solicitar el permiso de la Cámara cuando se presiona el botón "Cámara".
Si el usuario rechaza la solicitud, pero después de un tiempo aparece y presiona el botón "Cámara" nuevamente, shouldShowRequestPermissionRationale () volverá verdadero, por lo que la aplicación puede mostrar una explicación significativa de por qué se solicita el permiso y por qué no funciona correctamente sin ella. Normalmente mostraría en esa ventana de diálogo un botón para negar nuevamente / decidir más tarde, y un botón para otorgar los permisos. El botón de otorgar permisos en el cuadro de diálogo de justificación, debe iniciar la solicitud de permiso nuevamente. Esta vez, el usuario también tendrá una casilla de verificación "Nunca volver a mostrar". Si decide seleccionarlo y volver a denegar el permiso, notificará al sistema Android que el usuario y la aplicación no están en la misma página. Esa acción tendría dos consecuencias: shouldShowRequestPermissionRationale () siempre devolverá false,
Pero también hay otro escenario posible en el que onRequestPermissionsResult podría usarse. Por ejemplo, algunos dispositivos pueden tener una política de dispositivos que deshabilita la cámara (funciona para CIA, DARPA, etc.). En estos dispositivos, onRequestPermissionsResult siempre devolverá falso, y el método requestPermissions () denegará silenciosamente la solicitud.
Eso es lo que obtuve al escuchar el podcast con Ben Poiesz, un gerente de producto en el marco de Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
fuente
Simplemente publique otra opción, si alguien puede sentirlo. Puede usar EasyPermissions, que fue proporcionado por el propio Google, para, como se dijo, "Simplificar los permisos del sistema Android M".
Entonces no tienes que manejar
shouldShowRequestPermissionRationale
directamente.fuente
permissionPermanentlyDenied
internamente solo llamadasshouldShowPermissionsRationale
y devolucionestrue
en el caso en que nunca se solicitó al usuario que otorgue permisos.Si alguien está interesado en una solución de Kotlin, refactoré la respuesta de @muthuraj para estar en Kotlin. También se modernizó un poco para tener un bloque de finalización en lugar de oyentes.
Permiso hasta
Permiso Manejador
Implementación
fuente
Verifica esta implementación. Funciona bastante bien para mí. básicamente, verifica los permisos en el método checkPermissions () pasando una lista de permisos. Comprueba el resultado de la solicitud de permiso en onRequestPermissionsResult (). La implementación le permite abordar ambos casos cuando el usuario selecciona "nunca preguntar de nuevo" o no. En esta implementación, en caso de que seleccione "nunca preguntar de nuevo", el cuadro de diálogo tiene una opción para llevarlo a la Actividad de configuración de la aplicación.
Todo este código está dentro de mi fragmento. Estaba pensando que sería mejor crear una clase especializada para hacer esto, como un PermissionManager, pero no estoy seguro de eso.
fuente
Puede ser útil para alguien: -
Lo que he notado es que si marcamos el indicador shouldShowRequestPermissionRationale () en el método de devolución de llamada onRequestPermissionsResult (), solo muestra dos estados.
Estado 1: -Return true: - Cada vez que el usuario hace clic en Denegar permisos (incluida la primera vez).
Estado 2: - Devuelve falso: - si el usuario selecciona "nunca pregunta de nuevo".
Enlace para un ejemplo de trabajo detallado .
fuente
¿Podemos hacerlo de esta manera?
fuente
shouldShowRequestPermissionRationale
para permiso ESPECIAL siempre devuelve VERDADERO SOLO después de que el usuario lo haya denegado sin casilla de verificaciónEstamos interesados en el valor FALSO
Entonces hay 3 casos perdidos con valor falso :
1. no hubo tal acción anteriormente y ahora el usuario decide aceptar o negar.
Simplemente defina una preferencia
ASKED_PERMISSION_*
que no existe ahora y que sería cierta enonRequestPermissionsResult
su inicio en cualquier caso de acuerdo o denegaciónEntonces, aunque esta preferencia no existe, no hay razón para verificar
shouldShowRequestPermissionRationale
2. el usuario hizo clic en aceptar.
Simplemente haz:
Lo cual devolverá verdadero y no hay razón para verificar
shouldShowRequestPermissionRationale
3. el usuario hizo clic en denegar con casilla de verificación (segundo o más tiempo solicitado)
Es EL MOMENTO de trabajar con el
shouldShowRequestPermissionRationale
que volverá FALSO(existe preferencia y no tenemos permiso)
fuente
Este código le pide al usuario que pida permiso durante el tiempo de ejecución, si el usuario lo permite, ejecuta el método de resultado, si el usuario lo niega, vuelve a preguntar con la descripción con el usuario denegar (pregunta nuevamente con las instrucciones), pero si el usuario elige no volver a preguntar nunca más. maneja nunca preguntar de nuevo, muestra la opción de configuración abierta con instrucciones.
fuente