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); } } 
  • Elija aleatoriamente el número int
  • Convertir HashMap a una cadena separada por comas
  • ¿Qué es List <?> En Java (Android)?
  • Android: implementa un temporizador de intervalo de 1 segundo antes de llamar a una función
  • getView de sobrecargado ArrayAdapter no se llama desde AsyncTask / onPostExecute
  • Envío de flujo de imágenes por problema de socket: Android
  • Android: Uso del patrón de observador con vistas (posiblemente MVC, MVVM relacionado)
  • Android.os.NetworkOnMainThreadException usando rxjava en android
  • Vida útil de las variables estáticas (clase)
  • Cómo cancelar una solicitud http
  • Google App Engine Java HTTP Publicar imagen desde el método API a Servlet
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.