1page.title=Permisos 2page.tags=previewresources, androidm 3page.keywords=permissions, runtime, preview 4page.image={@docRoot}preview/features/images/permissions_check.png 5@jd:body 6 7 8<div id="qv-wrapper"> 9 <div id="qv"> 10 <h2>Quickview</h2> 11 <ul> 12 <li>Si su aplicación tiene como destino el SDK de la versión preliminar de Android M, se solicitará a los usuarios que concedan permisos durante el tiempo de ejecución, en lugar de durante la instalación. 13</li> 14 <li>Los usuarios pueden cancelar los permisos en cualquier momento desde la pantalla Settings de la aplicación. 15</li> 16 <li>La aplicación necesita controlar los permisos cada vez que se ejecuta. 17</li> 18 </ul> 19 20 <h2>Contenido del documento</h2> 21 <ol> 22 <li><a href="#overview">Información general</a></li> 23 <li><a href="#coding">Codificación para permisos de tiempo de ejecución</a></li> 24 <li><a href="#testing">Prueba de permisos de tiempo de ejecución</a></li> 25 <li><a href="#best-practices">Mejores prácticas</a></li> 26 </ol> 27 28<!-- 29 <h2>Related Samples</h2> 30 <ol> 31 <li></li> 32 </ol> 33--> 34 35<!-- 36 <h2>See also</h2> 37 <ol> 38 <li></li> 39 </ol> 40--> 41 </div> <!-- qv --> 42</div> <!-- qv-wrapper --> 43 44 45<p> 46 M Developer Preview introduce un nuevo modelo de permisos de la aplicación que facilita a los usuarios el proceso de instalación y actualización de aplicaciones. 47 Si una aplicación que se ejecuta en la versión preliminar de Android M es compatible con el nuevo modelo de permisos, el usuario no tiene que conceder ningún permiso al instalar o actualizar la aplicación. En su lugar, la aplicación solicitará los permisos a medida que los vaya necesitado y el sistema mostrará al usuario un diálogo en el que le solicitará los permisos necesarios. 48 49 50 51 52</p> 53 54<p> 55 Si la aplicación es compatible con el nuevo modelo de permisos, podrá instalarse y ejecutarse en los dispositivos con versiones anteriores de Android, utilizando el modelo de permisos anterior en esos dispositivos. 56 57 58</p> 59 60<h2 id="overview"> 61 Información general 62</h2> 63 64<p> 65 En M Developer Preview, la plataforma introduce un nuevo modelo 66de permisos de la aplicación. A continuación, se presenta un resumen de los componentes principales de este nuevo modelo: 67</p> 68 69<ul> 70 <li> 71 <strong>Declaración de los permisos:</strong> Al igual que en las plataformas anteriores de Android, la aplicación declara todos los permisos que necesita en el manifiesto. 72 73 </li> 74 75 <li> 76 <strong>Grupos de permisos:</strong> Según su función, los permisos se dividen en 77<em>grupos de permisos</em>. Por ejemplo, el grupo de permisos 78<code>CONTACTS</code> contiene permisos para leer y escribir los contactos y la información de perfil del usuario. 79 80 </li> 81 82 <li> 83 <p><strong>Permisos limitados concedidos durante la instalación:</strong> Cuando el usuario instala o actualiza la aplicación, el sistema le concede a la aplicación todos los permisos que la aplicación solicita que corresponden a {@link 84 android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}. 85 86 87 Por ejemplo, los permisos para la alarma y los permisos de intento corresponden a {@link 88 android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}, por lo que se conceden automáticamente durante la instalación. 89 90 </p> 91 92 <p>El sistema puede concederle a la aplicación permisos de firma y de sistema, como se especifica en la sección <a href="#system-apps">Permisos de firma y de sistema de la aplicación</a>. 93 94 Al usuario <em>no</em> se le solicitará conceder ningún permiso durante la instalación. 95</p> 96 </li> 97 98 <li> 99 <strong>Solicitud de permisos al usuario durante el tiempo de ejecución:</strong> Cuando la aplicación solicita un permiso, el sistema le muestra al usuario un diálogo y luego llama a la función de devolución de llamada de la aplicación para notificarle si el permiso se otorgó. 100 101 Si el usuario concede un permiso, la aplicación recibe todos los permisos del área funcional de dicho permiso, los cuales fueron declarados en el manifiesto de la aplicación. 102 103 104 </li> 105 106</ul> 107 108<p> 109 Este modelo de permisos cambia la forma en la que la aplicación se comporta para características que requieren permisos. 110 A continuación, se presenta un resumen de las prácticas de desarrollo que debe seguir para ajustarse a este modelo: 111 112</p> 113 114<ul> 115 116 <li> 117 <strong>Siempre compruebe los permisos:</strong> Siempre que una aplicación necesite realizar una acción que requiere algún permiso, primero debe comprobar si ya tiene otorgado ese permiso. 118 119 En caso de no tenerlo, solicitará que se le otorgue ese permiso. 120 121 </li> 122 123 <li> 124 <strong>Administre la falta de permisos correctamente:</strong> Si la aplicación no recibe un permiso adecuado, deberá administrar la falla sin errores. 125 126 Por ejemplo, si se necesita el permiso solo para una característica añadida, la aplicación puede desactivar esa característica. 127 Si el permiso es fundamental para que la aplicación funcione, la aplicación podrá desactivar toda su funcionalidad e informar al usuario que se deben conceder dichos permisos. 128 129 130 </li> 131 132 <div class="figure" style="width:220px" id="fig-perms-screen"> 133 <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220"> 134 <p class="img-caption"> 135 <strong>Figura 1</strong> Pantalla de permisos en Settings de la aplicación. 136 </p> 137 </div> 138 139 <li> 140 <strong>Los permisos son revocables:</strong> Los usuarios pueden revocar los permisos en cualquier momento. 141 Si un usuario desactiva los permisos de una aplicación, la aplicación <em>no</em> recibe ningún aviso. 142 Nuevamente, la aplicación deberá verificar que cuenta con los permisos necesarios antes de realizar cualquier acción restringida. 143 144 </li> 145</ul> 146 147<p class="note"> 148 <strong>Nota:</strong> Si una aplicación tiene como destino M Developer Preview, <em>debe</em> utilizar el nuevo modelo de permisos. 149 150</p> 151 152<p> 153 A partir del lanzamiento de M Developer Preview, no todas las aplicaciones de Google implementarán por completo el nuevo modelo de permisos. 154 Google actualiza estas aplicaciones durante el transcurso de M Developer Preview para respetar adecuadamente las configuraciones de alternancia de los permisos. 155 156 157</p> 158 159<p class="note"> 160 <strong>Nota:</strong> Si la aplicación cuenta con su propia superficie de API, no transmita permisos sin antes asegurarse de que el iniciador de la llamada cuente con los permisos requeridos para acceder a esa información. 161 162 163</p> 164 165<h3 id="system-apps"> 166 Permisos de las aplicaciones de firma y de sistema 167</h3> 168 169<p> 170 Generalmente, cuando el usuario instala una aplicación, el sistema solo otorga a la aplicación 171{@link android.content.pm.PermissionInfo#PROTECTION_NORMAL 172 PROTECTION_NORMAL}. Sin embargo, en ciertas circunstancias, el sistema le concede a la aplicación más permisos: 173 174</p> 175 176<ul> 177 <li>Si una aplicación es parte de la imagen del sistema, la aplicación recibe automáticamente todos los permisos enumerados en el manifiesto. 178 179 </li> 180 181 <li>Si la aplicación solicita permisos en el manifiesto que corresponden a {@link 182 android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} y la aplicación está firmada con el mismo certificado que el de la aplicación que declaró dichos permisos, el sistema le concede a la aplicación que los solicita esos permisos durante la instalación. 183 184 185 186 </li> 187</ul> 188 189<p> 190 En ambos casos, el usuario aún puede revocar los permisos en cualquier momento si accede a la pantalla <strong>Settings</strong> del sistema y selecciona <strong>Apps ></strong> 191 192 <i>app_name</i> <strong>> Permissions</strong>. La aplicación debe seguir controlando los permisos al momento de la ejecución y solicitarlos si fuese necesario. 193 194 195</p> 196 197<h3 id="compatibility"> 198 Compatibilidad con modelos anteriores y posteriores 199</h3> 200 201<p> 202 Si una aplicación no tiene como destino M Developer Preview, la aplicación continúa utilizando el modelo de permisos anterior, incluso en dispositivos con la versión preliminar de Android M. 203 Cuando el usuario instala la aplicación, el sistema le solicita al usuario que otorgue todos los permisos enumerados en el manifiesto de la aplicación. 204 205 206</p> 207 208<p class="note"> 209 <strong>Nota:</strong> En dispositivos que ejecutan M Developer Preview, el usuario puede desactivar los permisos para cualquier aplicación (incluso para aplicaciones heredadas) desde la pantalla Settings de la aplicación. 210 211 Si un usuario desactiva permisos para una aplicación heredada, el sistema desactiva las funciones correspondientes de forma automática. 212 Cuando la aplicación intenta realizar una operación que requiere ese permiso, la operación no generará necesariamente una excepción. 213 214 En su lugar, devolverá un conjunto de datos vacíos, indicará un error o, de lo contrario, mostrará un comportamiento inesperado. 215 Por ejemplo, si realiza una consulta sobre el calendario sin permisos, el método devuelve un conjunto de datos vacíos. 216 217</p> 218 219<p> 220 Si instala una aplicación que utiliza el nuevo modelo de permisos en un dispositivo que no ejecuta la versión preliminar de Android M, el sistema la trata como cualquier otra aplicación: el sistema le pide al usuario, durante la instalación, que conceda los permisos declarados. 221 222 223 224</p> 225 226<p class="note"> 227 <strong>Nota:</strong> Para el lanzamiento de la versión preliminar, debe configurar la versión mínima del SDK en M Preview SDK para compilar con la versión del SDK preliminar. 228 Esto significa que no podrá probar dichas aplicaciones en plataformas anteriores durante la versión preliminar para desarrolladores. 229 230 231</p> 232 233<h3 id="perms-vs-intents">Permisos frente a intentos</h3> 234 235<p> 236 En muchas situaciones, puede elegir entre dos formas para que sus aplicaciones realicen una tarea. 237 Puede hacer que su aplicación solicite permiso para realizar la operación por sí misma. 238 De lo contrario, puede hacer que la aplicación utilice un intento para que otra aplicación realice la tarea. 239 240</p> 241 242<p> 243 Por ejemplo, supongamos que su aplicación necesita poder tomar fotografías con la cámara del dispositivo. 244 Su aplicación puede solicitar el permiso 245<code>android.permission.CAMERA</code>, lo que le permite a su aplicación acceder a la cámara directamente. 246 Entonces, su aplicación utilizará las API de la cámara para controlar la cámara y tomar una fotografía. 247 Este enfoque le otorga a su aplicación total control del proceso de fotografía y le permite incorporar la UI de la cámara en su aplicación. 248 249 250</p> 251 252<p> 253 Sin embargo, si no necesita dicho control, puede utilizar {@link 254 android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} para solicitar una imagen. 255 Cuando ejecute el intento, se le solicita al usuario que elija una aplicación de cámara (en caso de que no haya una aplicación de cámara predeterminada) y esa aplicación tomará la fotografía. 256 257 La aplicación de cámara devuelve la fotografía al método {@link 258 android.app.Activity#onActivityResult onActivityResult()} de su aplicación. 259</p> 260 261<p> 262 De manera similar, si necesita realizar una llamada telefónica, acceder a los contactos del usuario, etc., lo puede hacer creando intentos apropiados o puede solicitar los permisos e ingresar directamente a los objetos apropiados. 263 264 Cada enfoque tiene ventajas y desventajas. 265 266</p> 267 268<p> 269 Si utiliza los permisos: 270</p> 271 272<ul> 273 <li>La aplicación posee total control sobre la experiencia del usuario cuando usted realiza la operación. 274 Sin embargo, un control tan amplio complica su tarea, ya que usted deberá diseñar una UI apropiada. 275 276 </li> 277 278 <li>Se le solicita al usuario otorgar el permiso una vez, la primera vez que usted realiza la operación. 279 Luego, su aplicación puede realizar la operación sin requerir interacción adicional por parte del usuario. 280 Sin embargo, si el usuario no concede el permiso (o lo revoca luego), su aplicación queda inhabilitada para realizar la operación. 281 282 283 </li> 284</ul> 285 286<p> 287 Si utiliza un intento: 288</p> 289 290<ul> 291 <li>No debe diseñar la UI para la operación. La aplicación que controla el intento provee la UI. Sin embargo, esto significa que usted no tiene control sobre la experiencia del usuario. 292 293 El usuario podrá interactuar con una aplicación que usted no conoce. 294 295 </li> 296 297 <li>Si el usuario no tiene una aplicación predeterminada para la operación, el sistema le solicita al usuario que elija una aplicación. Si el usuario no designa un controlador predeterminado, es probable que surja un diálogo adicional cada vez que realice la operación. 298 299 300 301 </li> 302</ul> 303 304<h2 id="coding">Codificación para permisos de tiempo de ejecución</h2> 305 306<p> 307 Si su aplicación tiene como destino el nuevo M Developer Preview, deberá usar el nuevo modelo de permisos. 308 Esto significa que, además de declarar los permisos necesarios en el manifiesto, también debe comprobar si tiene los permisos de tiempo de ejecución y solicitarlos en caso de no tenerlos. 309 310 311 312</p> 313 314<h3 id="enabling"> 315 Habilitar el nuevo modelo de permisos 316</h3> 317 318<p> 319 Para habilitar el nuevo modelo de permisos de M Developer Preview, configure el atributo 320<code>targetSdkVersion</code> de la aplicación en <code>"MNC"</code> y 321<code>compileSdkVersion</code> en <code>"android-MNC"</code>. Al hacerlo, se habilitan todas las características de los nuevos permisos. 322 323</p> 324 325<p> 326 Para el lanzamiento de la versión preliminar, debe establecer <code>minSdkVersion</code> en 327<code>"MNC"</code> para compilar con el SDK preliminar. 328</p> 329 330<h3 id="m-only-perm"> 331 Establecer un permiso solo para la versión preliminar de Android M 332</h3> 333 334<p> 335 Puede utilizar el nuevo elemento <code><uses-permission-sdk-m></code> en el manifiesto de la aplicación para indicar que se necesita un permiso solo para M Developer Preview. 336 Si declara un permiso de esta manera, cuando la aplicación se instale en un dispositivo anterior, el sistema no le solicitará al usuario el permiso ni se lo otorgará a la aplicación. Al usar el elemento <code><uses-permission-sdk-m></code>, puede añadir nuevos permisos a las versiones actualizadas de su aplicación sin forzar a los usuarios a otorgar permisos cuando instalen la actualización. 337 338 339 340 341 342 343</p> 344 345<p> 346 Si la aplicación se ejecuta en un dispositivo con M Developer Preview, 347<code><uses-permission-sdk-m></code> se comporta al igual que 348<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>. 349 El sistema no le solicita al usuario que otorgue ningún permiso al instalar la aplicación y la aplicación solicita los permisos a medida que se necesiten. 350 351</p> 352 353<h3 id="prompting"> 354 Solicitar permisos 355</h3> 356 357<p> 358 Si su aplicación utiliza el nuevo modelo de permisos de M Developer Preview, no se le pedirá al usuario que otorgue todos los permisos cuando la aplicación se ejecute por primera vez en un dispositivo con la versión preliminar de Android M. 359 360 En su lugar, su aplicación solicita los permisos a medida que los necesita. 361 Cuando su aplicación solicita un permiso, el sistema le muestra un diálogo al usuario. 362 363</p> 364 365<p> 366 Si su aplicación se ejecuta en un dispositivo con SDK 22 o anterior, la aplicación utiliza el modelo de permisos anterior. 367 Cuando el usuario instala la aplicación, se le solicita que otorgue todos los permisos que la aplicación requiere en su manifiesto, excepto aquellos permisos marcados con <code><uses-permission-sdk-m></code>. 368 369 370</p> 371 372<h4 id="check-platform">Controlar en qué plataforma se ejecuta la aplicación</h4> 373 374<p> 375 Este modelo de permisos es compatible solamente con dispositivos que ejecutan M Developer Preview. 376 Antes de llamar a cualquiera de estos métodos, la aplicación debe verificar en qué plataforma se está ejecutando y, para hacerlo, se controla el valor de {@link android.os.Build.VERSION#CODENAME 377 Build.VERSION.CODENAME}. 378 379 Si el dispositivo ejecuta M Developer Preview, 380{@link android.os.Build.VERSION#CODENAME CODENAME} es <code>"MNC"</code>. 381</p> 382 383<h4 id="check-for-permission">Controlar si la aplicación cuenta con los permisos necesarios</h4> 384 385<p>Cuando el usuario intenta realizar algo que requiere un permiso, la aplicación controla si ya tiene el permiso para realizar esa operación. 386 Para hacerlo, la aplicación llama a <code>Context.checkSelfPermission( 387 388<i>permission_name</i>)</code>. La aplicación debe realizar este control incluso si sabe que el usuario ya ha concedido ese permiso, ya que el usuario puede revocar los permisos de una aplicación en cualquier momento. 389 390 391 Por ejemplo, si un usuario quiere usar una aplicación para tomar una fotografía, la aplicación llama a <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>. 392 393</p> 394 395<p class="table-caption" id="permission-groups"> 396 <strong>Tabla 1.</strong> Permisos y grupo de permisos.</p> 397<table> 398 <tr> 399 <th scope="col">Grupo de permisos</th> 400 <th scope="col">Permisos</th> 401 </tr> 402 403 <tr> 404 <td><code>android.permission-group.CALENDAR</code></td> 405 <td> 406 <ul> 407 <li> 408 <code>android.permission.READ_CALENDAR</code> 409 </li> 410 </ul> 411 <ul> 412 <li> 413 <code>android.permission.WRITE_CALENDAR</code> 414 </li> 415 </ul> 416 </td> 417 </tr> 418 419 <tr> 420 <td><code>android.permission-group.CAMERA</code></td> 421 <td> 422 <ul> 423 <li> 424 <code>android.permission.CAMERA</code> 425 </li> 426 </ul> 427 </td> 428 </tr> 429 430 <tr> 431 <td><code>android.permission-group.CONTACTS</code></td> 432 <td> 433 <ul> 434 <li> 435 <code>android.permission.READ_CONTACTS</code> 436 </li> 437 <li> 438 <code>android.permission.WRITE_CONTACTS</code> 439 </li> 440 <li> 441 <code>android.permission.READ_PROFILE</code> 442 </li> 443 <li> 444 <code>android.permission.WRITE_PROFILE</code> 445 </li> 446 </ul> 447 </td> 448 </tr> 449 450 <tr> 451 <td><code>android.permission-group.LOCATION</code></td> 452 <td> 453 <ul> 454 <li> 455 <code>android.permission.ACCESS_FINE_LOCATION</code> 456 </li> 457 <li> 458 <code>android.permission.ACCESS_COARSE_LOCATION</code> 459 </li> 460 </ul> 461 </td> 462 </tr> 463 464 <tr> 465 <td><code>android.permission-group.MICROPHONE</code></td> 466 <td> 467 <ul> 468 <li> 469 <code>android.permission.RECORD_AUDIO</code> 470 </li> 471 </ul> 472 </td> 473 </tr> 474 475 <tr> 476 <td><code>android.permission-group.PHONE</code></td> 477 <td> 478 <ul> 479 <li> 480 <code>android.permission.READ_PHONE_STATE</code> 481 </li> 482 <li> 483 <code>android.permission.CALL_PHONE</code> 484 </li> 485 <li> 486 <code>android.permission.READ_CALL_LOG</code> 487 </li> 488 <li> 489 <code>android.permission.WRITE_CALL_LOG</code> 490 </li> 491 <li> 492 <code>com.android.voicemail.permission.ADD_VOICEMAIL</code> 493 </li> 494 <li> 495 <code>android.permission.USE_SIP</code> 496 </li> 497 <li> 498 <code>android.permission.PROCESS_OUTGOING_CALLS</code> 499 </li> 500 </ul> 501 </td> 502 </tr> 503 504 <tr> 505 <td><code>android.permission-group.SENSORS</code></td> 506 <td> 507 <ul> 508 <li> 509 <code>android.permission.BODY_SENSORS</code> 510 </li> 511 </ul> 512 <ul> 513 <li> 514 <code>android.permission.USE_FINGERPRINT</code> 515 </li> 516 </ul> 517 </td> 518 </tr> 519 520 <tr> 521 <td><code>android.permission-group.SMS</code></td> 522 <td> 523 <ul> 524 <li> 525 <code>android.permission.SEND_SMS</code> 526 </li> 527 <li> 528 <code>android.permission.RECEIVE_SMS</code> 529 </li> 530 <li> 531 <code>android.permission.READ_SMS</code> 532 </li> 533 <li> 534 <code>android.permission.RECEIVE_WAP_PUSH</code> 535 </li> 536 <li> 537 <code>android.permission.RECEIVE_MMS</code> 538 </li> 539 <li> 540 <code>android.permission.READ_CELL_BROADCASTS</code> 541 </li> 542 </ul> 543 </td> 544 </tr> 545 546</table> 547 548<h4 id="request-permissions">Solicitar permisos si se necesitan</h4> 549 550<p>Si la aplicación no posee los permisos que necesita, llama al método 551<code>Activity.requestPermissions(String[], int)</code> para solicitar el permiso o los permisos apropiados. 552 La aplicación pasa el permiso o los permisos que necesita y un “código de solicitud” entero. 553 554 Este método funciona de manera asincrónica: realiza la devolución inmediatamente y cuando el usuario responde a la ventana de diálogo, el sistema llama al método de devolución de llamada de la aplicación con los resultados, y pasa el mismo “código de solicitud” que pasó la aplicación a 555<code>requestPermissions()</code>. 556 557</p> 558 559 <p>El siguiente código verifica si la aplicación tiene permisos para leer los contactos del usuario y solicita los permisos de ser necesario: 560</p> 561 562<pre> 563if (checkSelfPermission(Manifest.permission.READ_CONTACTS) 564 != PackageManager.PERMISSION_GRANTED) { 565 requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 566 MY_PERMISSIONS_REQUEST_READ_CONTACTS); 567 568 // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 569 // app-defined int constant 570 571 return; 572} 573</pre> 574 575<h4 id="handle-response">Administrar la respuesta a la solicitud de permisos</h4> 576 577<p> 578 Cuando una aplicación solicita permisos, el sistema le muestra al usuario una ventana de diálogo. 579 Cuando el usuario responde, el sistema invoca 580<code>Activity.onRequestPermissionsResult(int, String[], int[])</code> 581 de su aplicación y le transfiere la respuesta del usuario. Su aplicación necesita invalidar ese método. La devolución de llamada pasa el mismo código de solicitud que usted pasó a <code>requestPermissions()</code>. 582 583 Por ejemplo, si una aplicación solicita acceso <code>READ_CONTACTS</code>, es posible que tenga el siguiente método de devolución de llamada: 584 585 586</p> 587 588<pre> 589@Override 590public void onRequestPermissionsResult(int requestCode, 591 String permissions[], int[] grantResults) { 592 switch (requestCode) { 593 case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 594 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 595 596 // permission was granted, yay! do the 597 // calendar task you need to do. 598 599 } else { 600 601 // permission denied, boo! Disable the 602 // functionality that depends on this permission. 603 } 604 return; 605 } 606 607 // other 'switch' lines to check for other 608 // permissions this app might request 609 } 610} 611</pre> 612 613 <p>Si el usuario concede un permiso, el sistema le otorga a la aplicación todos los permisos enumerados en el manifiesto para esa área funcional. 614 Se deben tomar acciones apropiadas si el usuario rechaza la solicitud. 615 Por ejemplo, usted podría desactivar cualquier acción del menú que dependa de este permiso. 616 617 </li> 618</p> 619 620<p> 621 Cuando el sistema le solicita al usuario que otorgue un permiso, el usuario tiene la opción de indicarle al sistema que no solicite ese permiso de nuevo. 622 En ese caso, cuando la aplicación utiliza <code>requestPermissions()</code> para solicitar ese permiso, el sistema rechaza la solicitud inmediatamente. 623 624 En este caso, el sistema llama a su <code>onRequestPermissionsResult()</code> de la misma manera en que lo haría si el usuario hubiese rechazado explícitamente su solicitud nuevamente. 625 626 Por esta razón, su aplicación no puede asumir que se ha llevado a cabo algún tipo de interacción con el usuario. 627 628</p> 629 630<h2 id="testing">Prueba de permisos de tiempo de ejecución</h2> 631 632 633<p> 634 Si su aplicación tiene como destino M Developer Preview, debe probar que administre los permisos correctamente. 635 No debe asumir que su aplicación tiene algún permiso en particular cuando se ejecuta. 636 Cuando la aplicación se ejecuta por primera vez, es muy probable que no tenga permisos y el usuario puede revocar o reestablecer los permisos en cualquier momento. 637 638 639</p> 640 641<p> 642 Debe probar su aplicación para asegurarse de que funciona correctamente en todas las situaciones de permisos. 643 Con el SDK de la versión preliminar de Android M, hemos brindado nuevos comandos <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (adb)</a> que le permitirán probar su aplicación con cualquier configuración de permisos que necesite probar. 644 645 646 647</p> 648 649<h3> 650 Nuevas opciones y comandos adb 651</h3> 652 653<p> 654 Las herramientas de plataforma del SDK de la versión preliminar de Android M contienen varios comandos nuevos que le permiten probar la manera en que su aplicación administra los permisos. 655 656</p> 657 658<h4> 659 Instalar con permisos 660</h4> 661 662<p> 663 Puede utilizar la nueva opción <code>-g</code> del comando <a href="{@docRoot}tools/help/adb.html#move"><code>adb 664 install</code></a>, que instala la aplicación y concede todos los permisos enumerados en el manifiesto de la aplicación: 665 666</p> 667 668<pre class="no-pretty-print"> 669$ adb install -g <path_to_apk> 670</pre> 671 672<h4> 673 Conceder y revocar permisos 674</h4> 675 676<p> 677 Puede utilizar los comandos ADB nuevos <a href="{@docRoot}tools/help/adb.html#pm">package manager (pm)</a> para conceder y revocar permisos a una aplicación instalada. Esta funcionalidad puede resultar útil para pruebas automáticas. 678 679 680</p> 681 682<p> 683 Para conceder un permiso, utilice el comando <code>grant</code> de package manager: 684</p> 685 686<pre class="no-pretty-print"> 687$ adb pm grant <package_name> <permission_name> 688</pre> 689 690<p> 691 Por ejemplo, para conceder el paquete de permisos com.example.myapp para grabar audio utilice este comando: 692 693</p> 694 695<pre class="no-pretty-print"> 696$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO 697</pre> 698 699<p> 700 Para revocar un permiso, utilice el comando <code>revoke</code> de package manager: 701</p> 702 703<pre class="no-pretty-print"> 704$ adb pm revoke <package_name> <permission_name> 705</pre> 706 707<h2 id="best-practices">Mejores prácticas</h2> 708 709<p> 710 El nuevo modelo de permisos brinda a los usuarios una experiencia más fluida y les facilita la instalación de aplicaciones, además de hacerlos sentir cómodos con las actividades de sus aplicaciones. 711 712 Sugerimos las siguientes mejores prácticas para obtener el mayor beneficio del nuevo modelo. 713 714</p> 715 716 717<h3 id="bp-what-you-need">Solicite solo los permisos que necesite</h3> 718 719<p> 720 Cada vez que solicite un permiso, usted obliga al usuario a tomar una decisión. 721 La funcionalidad de su aplicación se verá reducida si el usuario rechaza la solicitud. 722 Debe minimizar la cantidad de veces que realiza estas solicitudes. 723</p> 724 725<p> 726 Por ejemplo, a menudo, su aplicación puede obtener la funcionalidad necesaria a través de un <a href="{@docRoot}guide/components/intents-filters.html">intento</a> en lugar de una solicitud de permiso. 727 728 Si su aplicación necesita tomar fotografías con la cámara del teléfono, la aplicación puede utilizar un intento {@link 729 android.provider.MediaStore#ACTION_IMAGE_CAPTURE 730 MediaStore.ACTION_IMAGE_CAPTURE}. 731 Cuando su aplicación ejecuta el intento, el sistema le solicita al usuario que elija una aplicación para la cámara que ya está instalada a fin de tomar la fotografía. 732 733 734</p> 735 736<h3 id="bp-dont-overwhelm"> 737 No abrume al usuario 738</h3> 739 740<p> 741 Si expone al usuario a muchas solicitudes de permisos al mismo tiempo, lo abrumará y hará que deje de usar su aplicación. Por el contrario, debe pedir permisos en la medida que los necesite. 742 743 744</p> 745 746<p> 747 A veces, uno o más permisos pueden ser absolutamente necesarios para la aplicación. En ese caso, es recomendable pedir todos los permisos no bien se inicie la aplicación. 748 749 Por ejemplo, si crea una aplicación de fotografía, la aplicación necesitará acceso a la cámara del dispositivo. 750 Cuando el usuario inicie la aplicación por primera vez, no se sorprenderá si la aplicación le solicita permiso para usar la cámara. 751 752 Sin embargo, si la misma aplicación además tuviese una característica para compartir fotografías con los contactos del usuario, <em>no</em> solicite ese permiso la primera vez que se ejecute. 753 754 En su lugar, espere hasta que el usuario utilice la característica “compartir” para solicitar el permiso en ese momento. 755 756</p> 757 758<p> 759 Si su aplicación proporciona un tutorial, se recomienda que se pidan los permisos esenciales de la aplicación al final del tutorial. 760 761</p> 762 763<h3 id="bp-explain"> 764 Explique por qué se necesitan los permisos 765</h3> 766 767<p> 768 El diálogo de permisos que muestra el sistema cuando llama a 769 <code>requestPermissions()</code> informa qué permisos necesita su aplicación pero no establece el motivo. 770 A veces, el usuario puede confundirse. 771 Es una buena idea explicarle al usuario los motivos por los que la aplicación necesita esos permisos antes de llamar a <code>requestPermissions()</code>. 772 773</p> 774 775<p> 776 Por ejemplo, una aplicación de fotografía puede solicitar servicios de ubicación para añadir una etiqueta geográfica a las fotografías. 777 Es posible que un usuario típico no sepa que una fotografía puede contener información sobre la ubicación y se confundiría si una aplicación de fotografía solicita la ubicación. 778 779 En este caso, es recomendable que la aplicación le informe al usuario acerca de esta característica <em>antes</em> de llamar a 780<code>requestPermissions()</code>. 781 782</p> 783 784<p> 785 Una forma de hacerlo es incorporar estas solicitudes en el tutorial de la aplicación. El tutorial puede mostrar todas las características de la aplicación, una por vez, y mientras lo hace explicar los permisos que son necesarios. 786 787 Por ejemplo, el tutorial de la aplicación de fotografía puede mostrar la característica “compartir fotografías con contactos” y luego explicarle al usuario que debe otorgar permisos para que la aplicación vea los contactos del usuario. 788 789 790 La aplicación puede entonces llamar a <code>requestPermissions()</code> para solicitarle al usuario ese acceso. 791 Por supuesto, no todos los usuarios siguen el tutorial, por lo que aun así debe controlar y solicitar los permisos durante el funcionamiento normal de la aplicación. 792 793 794</p> 795