Estoy actualizando nuestra aplicación para usar el nuevo sistema de permisos de tiempo de ejecución M. Todo funciona a excepción de onRequestPermissionsResult (). Necesito verificar un permiso al presionar un botón y, si tiene éxito, enviar un mensaje de texto. Cuando otorgo permiso para hacerlo, el cuadro de diálogo se cierra, pero no activa el envío de texto hasta que vuelva a presionar el botón.
He depurado y establecido puntos de interrupción en el método onRequestPermissionsResult () pero nunca entra en él.
Este método se llama primero:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
Y luego mi devolución de llamada se ve así:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
¿Alguien se ha encontrado con un problema similar? Agradezco cualquier ayuda con esto. Gracias
fuente
Fragment.requestPermissions()
, la actividad principal realmente está recibiendo elonRequestPermissionsResult()
. (Esto es con la biblioteca de soporte 23.3.0)Puedes probar esto:
Si está llamando a este código desde un fragmento, tiene su propio método requestPermissions. Creo que el problema es que está llamando al método estático.
Consejo profesional si quieres que esté
onRequestPermissionsResult()
en un fragmento:FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
fuente
Espero que funcione bien
Para la actividad:
Para el fragmento:
fuente
También encontré este problema. Si desea que la actividad que maneja permisos que no están en el historial / recientes, se verá tentado a cambiar su
AndroidManifest.xml
entrada.Si configura la actividad a la que llama
requestPermissions
oAppCompatActivity.requestPermissions
conen su
AndroidManifest.xml
entoncesonRequestPermissionsResult()
no será llamado. Esto es cierto si su Actividad se deriva deActivity
oAppCompatActivity
.Esto se puede solucionar eliminando ambos indicadores de 'AndroidManifest.xml' y finalizando con su actividad
finishAndRemoveTask()
.fuente
Si tiene
onRequestPermissionsResult
actividad y fragmento, asegúrese de llamarsuper.onRequestPermissionsResult
a la actividad. No se requiere en fragmentos, pero está en actividad.fuente
FragmentActivity.onRequestPermissionsResult(..)
es dondeonRequestPermissionsResult(..)
se reenvía la llamada al fragmento .Respuesta obsoleta, consulte: https://developer.android.com/training/permissions/requesting
Dentro del fragmento, debe llamar:
No:
fuente
Si está utilizando requestPermissions en fragmentos, acepta 2 parámetros en lugar de 3.
Deberías usar
requestPermissions(permissions, PERMISSIONS_CODE);
fuente
Si por alguna razón ha extendido una Actividad personalizada ubicada en una biblioteca externa que no llama al super, deberá llamar manualmente al Fragmento super.onRequestPermissionsResult usted mismo en su Activity onRequestPermissionsResult.
fuente
Tiene la función checkPermissions para dispositivos pre Marshmallow en FragmentCompat . Yo uso así:
fuente
He descubierto que es importante donde llamas
android.support.v4.app.Fragment.requestPermissions
.Si lo haces en
onCreate()
,onRequestPermissionsResult()
nunca se llama.Solución: llámalo
onActivityCreated()
;fuente
onActivityCreated()
mi código. SDK 23.onPause()
?Este problema fue causado realmente por NestedFragments. Básicamente, en la mayoría de los fragmentos hemos extendido un HostedFragment que a su vez extiende un CompatFragment. Tener estos fragmentos anidados causó problemas que finalmente fueron resueltos por otro desarrollador en el proyecto.
Estaba haciendo algunas cosas de bajo nivel, como el cambio de bits para que esto funcione, así que no estoy muy seguro de la solución final real
fuente
fuente
Esto funcionará ...
fuente
Si está llamando a este código desde un fragmento, tiene su propio método requestPermissions.
Entonces, el concepto básico es: si está en una actividad, llame al
y si está en un fragmento, solo llame
fuente
FragmentCompat.requestPermissions()
.Tuve un problema similar, excepto que estaba presionando un botón para hacer una llamada, lo que activa el callIntent. Primero verifiqué el permiso, si no me lo otorgan, pido permiso y en RequestPermissionResult llamo al permiso de verificación y llamo nuevamente.
fuente
Según la respuesta de goodgamerguy, la solución es:
fuente
¡Antes de verificar todo de acuerdo con las respuestas anteriores, asegúrese de que su código de solicitud no sea 0!
verifique el código de onRequestPermissionsResult () en FragmentActivity.java:
fuente
fuente
Tengo una solución increíble para lograr esto, hacer una BaseActivity como esta.
}
Ahora puedes llamar al código para pedir un permiso como este
Ahora, cada vez que esto sucede en cualquier parte, ya sea en su fragmento o en cualquier actividad, la actividad base se llamaría.
Gracias
fuente
Puedes usar
requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);
. No use FragmentCompat si está usando v4.fuente
Detalles
Algoritmo
módulo - cámara, ubicación, ....
Caracteristicas
Solución
Uso en la actividad (en fragmento igual)
fuente
Aquí quiero mostrar mi código cómo logré esto.
Aquí en esta clase quiero verificar el permiso otorgado o no. Es entonces cuando llamaré al permiso de mi MainActivity como
Ahora, en el método onCreate, debe llamar a la función requestForPermission ().
Eso es todo, también puedes solicitar permisos múltiples a la vez.
fuente
ACTUALIZACIÓN: vi la respuesta de otra persona sobre llamar
super.onRequestPermissionResult()
a Activity y eso soluciona el problema del código de solicitud que mencioné y llama al fragmento onRequestPermissionResult del fragmento.ignora estas cosas:
Para mí estaba llamando a
onRequestPermissionResult
la Actividad a pesar de que yo llamabafragment.requestPermission(...)
, PERO devolvió el resultado con un código de solicitud incorrecto (111 se convirtió en 65647 ¿por qué? Nunca lo sabré).Afortunadamente, este es el único permiso que solicitamos en esa pantalla, así que simplemente ignoro el código de solicitud (no tengo tiempo para descubrir por qué no es correcto en este momento)
fuente
También me encontré con un problema que, incluso si llama a requestPermissions correcto, aún puede tener este problema. El problema es que la actividad principal puede anular este método sin llamar a super. Agregue super y se solucionará.
fuente