Permisos de tiempo de ejecución de Android: cómo implementar

La documentación para desarrolladores de Android ofrece este ejemplo de solicitud de permisos en tiempo de ejecución:

// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } 

¿Qué es "MY_PERMISSIONS_REQUEST_READ_CONTACTS" en este ejemplo? Dice que es una constante int de la app-defined, pero eso significa que debo hacer un Constants.java y declarar un int estático público? ¿Cuál debe ser el valor?

En otros ejemplos, veo que la gente usa 1 aquí, 0 0xFFEEDDCC, pero no puedo encontrar una explicación de lo que es. ¿Puede alguien explicarme qué necesita ir aquí y por qué? (En mi caso, necesito asegurarme de que la aplicación tenga permiso para acceder a la ubicación correcta)

La documentación de ActivityCompat dice "Código de solicitud específica de aplicación para coincidir con un resultado reportado a onRequestPermissionsResult"? Esto no me ayuda.

3 Solutions collect form web for “Permisos de tiempo de ejecución de Android: cómo implementar”

¿Qué es "MY_PERMISSIONS_REQUEST_READ_CONTACTS" en este ejemplo?

Es un int , para atar una requestPermissions() particular requestPermissions() a la devolución de llamada onRequestPermissionsResult() correspondiente.

Bajo las portadas, requestPermissions() utiliza startActivityForResult() ; Este int desempeña el mismo papel que en startActivityForResult() .

Que significa que debo hacer un Constants.java y declarar un int estático público?

Yo sólo lo haría un private static final int en la actividad. Pero, puede declararlo donde quiera.

¿Cuál debe ser el valor?

Me parece recordar que debe ser inferior a 0x8000000, pero de lo contrario puede ser lo que quieras. El valor que utiliza para cada llamada requestPermissions() en una actividad debe obtener un int distinto, pero los números reales no importan.

Si su actividad tiene sólo una llamada requestPermissions() , entonces el valor int realmente no importa. Pero muchas aplicaciones tendrán varias requestPermissions() en una actividad. En ese caso, el desarrollador puede necesitar saber, en onRequestPermissionsResult() , para qué solicitud es el resultado.

Mira un poco más abajo en la documentación en "Manejar la respuesta de solicitud de permisos" y verá su propósito.

Un método de devolución de llamada llamado onRequestPermissionsResult devuelve el mismo código que un parámetro para saber qué permiso se solicitó / concedió:

 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } } 

Puesto que la constante es utilizada por usted solamente usted puede darle cualquier valor que usted tenga gusto como public static final int . Cada permiso que se solicita necesita su propia constante.

 private void requestPermissionForCameraAndMicrophone() { if ( ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { Toast.makeText(this, R.string.permissions_needed, Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}, CAMERA_MIC_PERMISSION_REQUEST_CODE); } } 
  • ¿Cómo recuperar una lista de fuentes disponibles / instaladas en android?
  • Accediendo contenido de res / raw programatically (Android)
  • Abrir un cuadro de diálogo de entrada en Android
  • ¿Puedo desplazar un ScrollView de forma programática en Android?
  • Convertir timestamp en fecha actual en android
  • Android Studio: punto de interrupción en el método estático de la interfaz no funciona
  • ¿Cómo conseguir el día del mes?
  • Cómo renombrar un archivo existente?
  • Envía una solicitud JSONArray POST con android volley library
  • Android: ¿Cómo importar el contacto desde el teléfono?
  • ¿Cómo configuro mi SDK de Java al crear un proyecto de Android en IntelliJ?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.