1 page.title=Permisos 2 page.tags=previewresources, androidm 3 page.keywords=permissions, runtime, preview 4 page.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 aplicacin tiene como destino el SDK de la versin preliminar de Android M, se solicitar a los usuarios que concedan permisos durante el tiempo de ejecucin, en lugar de durante la instalacin. 13 </li> 14 <li>Los usuarios pueden cancelar los permisos en cualquier momento desde la pantalla Settings de la aplicacin. 15 </li> 16 <li>La aplicacin 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">Informacin general</a></li> 23 <li><a href="#coding">Codificacin para permisos de tiempo de ejecucin</a></li> 24 <li><a href="#testing">Prueba de permisos de tiempo de ejecucin</a></li> 25 <li><a href="#best-practices">Mejores prcticas</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 aplicacin que facilita a los usuarios el proceso de instalacin y actualizacin de aplicaciones. 47 Si una aplicacin que se ejecuta en la versin preliminar de Android M es compatible con el nuevo modelo de permisos, el usuario no tiene que conceder ningn permiso al instalar o actualizar la aplicacin. En su lugar, la aplicacin solicitar los permisos a medida que los vaya necesitado y el sistema mostrar al usuario un dilogo en el que le solicitar los permisos necesarios. 48 49 50 51 52 </p> 53 54 <p> 55 Si la aplicacin 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 Informacin general 62 </h2> 63 64 <p> 65 En M Developer Preview, la plataforma introduce un nuevo modelo 66 de permisos de la aplicacin. A continuacin, se presenta un resumen de los componentes principales de este nuevo modelo: 67 </p> 68 69 <ul> 70 <li> 71 <strong>Declaracin de los permisos:</strong> Al igual que en las plataformas anteriores de Android, la aplicacin declara todos los permisos que necesita en el manifiesto. 72 73 </li> 74 75 <li> 76 <strong>Grupos de permisos:</strong> Segn su funcin, 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 informacin de perfil del usuario. 79 80 </li> 81 82 <li> 83 <p><strong>Permisos limitados concedidos durante la instalacin:</strong> Cuando el usuario instala o actualiza la aplicacin, el sistema le concede a la aplicacin todos los permisos que la aplicacin 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 automticamente durante la instalacin. 89 90 </p> 91 92 <p>El sistema puede concederle a la aplicacin permisos de firma y de sistema, como se especifica en la seccin <a href="#system-apps">Permisos de firma y de sistema de la aplicacin</a>. 93 94 Al usuario <em>no</em> se le solicitar conceder ningn permiso durante la instalacin. 95 </p> 96 </li> 97 98 <li> 99 <strong>Solicitud de permisos al usuario durante el tiempo de ejecucin:</strong> Cuando la aplicacin solicita un permiso, el sistema le muestra al usuario un dilogo y luego llama a la funcin de devolucin de llamada de la aplicacin para notificarle si el permiso se otorg. 100 101 Si el usuario concede un permiso, la aplicacin recibe todos los permisos del rea funcional de dicho permiso, los cuales fueron declarados en el manifiesto de la aplicacin. 102 103 104 </li> 105 106 </ul> 107 108 <p> 109 Este modelo de permisos cambia la forma en la que la aplicacin se comporta para caractersticas que requieren permisos. 110 A continuacin, se presenta un resumen de las prcticas 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 aplicacin necesite realizar una accin que requiere algn 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 aplicacin no recibe un permiso adecuado, deber administrar la falla sin errores. 125 126 Por ejemplo, si se necesita el permiso solo para una caracterstica aadida, la aplicacin puede desactivar esa caracterstica. 127 Si el permiso es fundamental para que la aplicacin funcione, la aplicacin 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 aplicacin. 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 aplicacin, la aplicacin <em>no</em> recibe ningn aviso. 142 Nuevamente, la aplicacin deber verificar que cuenta con los permisos necesarios antes de realizar cualquier accin restringida. 143 144 </li> 145 </ul> 146 147 <p class="note"> 148 <strong>Nota:</strong> Si una aplicacin 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 implementarn 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 aplicacin 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 informacin. 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 aplicacin, el sistema solo otorga a la aplicacin 171 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL 172 PROTECTION_NORMAL}. Sin embargo, en ciertas circunstancias, el sistema le concede a la aplicacin ms permisos: 173 174 </p> 175 176 <ul> 177 <li>Si una aplicacin es parte de la imagen del sistema, la aplicacin recibe automticamente todos los permisos enumerados en el manifiesto. 178 179 </li> 180 181 <li>Si la aplicacin solicita permisos en el manifiesto que corresponden a {@link 182 android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} y la aplicacin est firmada con el mismo certificado que el de la aplicacin que declar dichos permisos, el sistema le concede a la aplicacin que los solicita esos permisos durante la instalacin. 183 184 185 186 </li> 187 </ul> 188 189 <p> 190 En ambos casos, el usuario an 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 aplicacin debe seguir controlando los permisos al momento de la ejecucin 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 aplicacin no tiene como destino M Developer Preview, la aplicacin contina utilizando el modelo de permisos anterior, incluso en dispositivos con la versin preliminar de Android M. 203 Cuando el usuario instala la aplicacin, el sistema le solicita al usuario que otorgue todos los permisos enumerados en el manifiesto de la aplicacin. 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 aplicacin (incluso para aplicaciones heredadas) desde la pantalla Settings de la aplicacin. 210 211 Si un usuario desactiva permisos para una aplicacin heredada, el sistema desactiva las funciones correspondientes de forma automtica. 212 Cuando la aplicacin intenta realizar una operacin que requiere ese permiso, la operacin no generar necesariamente una excepcin. 213 214 En su lugar, devolver un conjunto de datos vacos, indicar un error o, de lo contrario, mostrar un comportamiento inesperado. 215 Por ejemplo, si realiza una consulta sobre el calendario sin permisos, el mtodo devuelve un conjunto de datos vacos. 216 217 </p> 218 219 <p> 220 Si instala una aplicacin que utiliza el nuevo modelo de permisos en un dispositivo que no ejecuta la versin preliminar de Android M, el sistema la trata como cualquier otra aplicacin: el sistema le pide al usuario, durante la instalacin, que conceda los permisos declarados. 221 222 223 224 </p> 225 226 <p class="note"> 227 <strong>Nota:</strong> Para el lanzamiento de la versin preliminar, debe configurar la versin mnima del SDK en M Preview SDK para compilar con la versin del SDK preliminar. 228 Esto significa que no podr probar dichas aplicaciones en plataformas anteriores durante la versin 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 aplicacin solicite permiso para realizar la operacin por s misma. 238 De lo contrario, puede hacer que la aplicacin utilice un intento para que otra aplicacin realice la tarea. 239 240 </p> 241 242 <p> 243 Por ejemplo, supongamos que su aplicacin necesita poder tomar fotografas con la cmara del dispositivo. 244 Su aplicacin puede solicitar el permiso 245 <code>android.permission.CAMERA</code>, lo que le permite a su aplicacin acceder a la cmara directamente. 246 Entonces, su aplicacin utilizar las API de la cmara para controlar la cmara y tomar una fotografa. 247 Este enfoque le otorga a su aplicacin total control del proceso de fotografa y le permite incorporar la UI de la cmara en su aplicacin. 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 aplicacin de cmara (en caso de que no haya una aplicacin de cmara predeterminada) y esa aplicacin tomar la fotografa. 256 257 La aplicacin de cmara devuelve la fotografa al mtodo {@link 258 android.app.Activity#onActivityResult onActivityResult()} de su aplicacin. 259 </p> 260 261 <p> 262 De manera similar, si necesita realizar una llamada telefnica, 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 aplicacin posee total control sobre la experiencia del usuario cuando usted realiza la operacin. 274 Sin embargo, un control tan amplio complica su tarea, ya que usted deber disear 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 operacin. 279 Luego, su aplicacin puede realizar la operacin sin requerir interaccin adicional por parte del usuario. 280 Sin embargo, si el usuario no concede el permiso (o lo revoca luego), su aplicacin queda inhabilitada para realizar la operacin. 281 282 283 </li> 284 </ul> 285 286 <p> 287 Si utiliza un intento: 288 </p> 289 290 <ul> 291 <li>No debe disear la UI para la operacin. La aplicacin 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 aplicacin que usted no conoce. 294 295 </li> 296 297 <li>Si el usuario no tiene una aplicacin predeterminada para la operacin, el sistema le solicita al usuario que elija una aplicacin. Si el usuario no designa un controlador predeterminado, es probable que surja un dilogo adicional cada vez que realice la operacin. 298 299 300 301 </li> 302 </ul> 303 304 <h2 id="coding">Codificacin para permisos de tiempo de ejecucin</h2> 305 306 <p> 307 Si su aplicacin tiene como destino el nuevo M Developer Preview, deber usar el nuevo modelo de permisos. 308 Esto significa que, adems de declarar los permisos necesarios en el manifiesto, tambin debe comprobar si tiene los permisos de tiempo de ejecucin 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 aplicacin en <code>"MNC"</code> y 321 <code>compileSdkVersion</code> en <code>"android-MNC"</code>. Al hacerlo, se habilitan todas las caractersticas de los nuevos permisos. 322 323 </p> 324 325 <p> 326 Para el lanzamiento de la versin 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 versin 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 aplicacin para indicar que se necesita un permiso solo para M Developer Preview. 336 Si declara un permiso de esta manera, cuando la aplicacin se instale en un dispositivo anterior, el sistema no le solicitar al usuario el permiso ni se lo otorgar a la aplicacin. Al usar el elemento <code><uses-permission-sdk-m></code>, puede aadir nuevos permisos a las versiones actualizadas de su aplicacin sin forzar a los usuarios a otorgar permisos cuando instalen la actualizacin. 337 338 339 340 341 342 343 </p> 344 345 <p> 346 Si la aplicacin 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 ningn permiso al instalar la aplicacin y la aplicacin 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 aplicacin utiliza el nuevo modelo de permisos de M Developer Preview, no se le pedir al usuario que otorgue todos los permisos cuando la aplicacin se ejecute por primera vez en un dispositivo con la versin preliminar de Android M. 359 360 En su lugar, su aplicacin solicita los permisos a medida que los necesita. 361 Cuando su aplicacin solicita un permiso, el sistema le muestra un dilogo al usuario. 362 363 </p> 364 365 <p> 366 Si su aplicacin se ejecuta en un dispositivo con SDK 22 o anterior, la aplicacin utiliza el modelo de permisos anterior. 367 Cuando el usuario instala la aplicacin, se le solicita que otorgue todos los permisos que la aplicacin 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 aplicacin</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 mtodos, la aplicacin 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 aplicacin cuenta con los permisos necesarios</h4> 384 385 <p>Cuando el usuario intenta realizar algo que requiere un permiso, la aplicacin controla si ya tiene el permiso para realizar esa operacin. 386 Para hacerlo, la aplicacin llama a <code>Context.checkSelfPermission( 387 388 <i>permission_name</i>)</code>. La aplicacin 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 aplicacin en cualquier momento. 389 390 391 Por ejemplo, si un usuario quiere usar una aplicacin para tomar una fotografa, la aplicacin 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 aplicacin no posee los permisos que necesita, llama al mtodo 551 <code>Activity.requestPermissions(String[], int)</code> para solicitar el permiso o los permisos apropiados. 552 La aplicacin pasa el permiso o los permisos que necesita y un cdigo de solicitud entero. 553 554 Este mtodo funciona de manera asincrnica: realiza la devolucin inmediatamente y cuando el usuario responde a la ventana de dilogo, el sistema llama al mtodo de devolucin de llamada de la aplicacin con los resultados, y pasa el mismo cdigo de solicitud que pas la aplicacin a 555 <code>requestPermissions()</code>. 556 557 </p> 558 559 <p>El siguiente cdigo verifica si la aplicacin tiene permisos para leer los contactos del usuario y solicita los permisos de ser necesario: 560 </p> 561 562 <pre> 563 if (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 aplicacin solicita permisos, el sistema le muestra al usuario una ventana de dilogo. 579 Cuando el usuario responde, el sistema invoca 580 <code>Activity.onRequestPermissionsResult(int, String[], int[])</code> 581 de su aplicacin y le transfiere la respuesta del usuario. Su aplicacin necesita invalidar ese mtodo. La devolucin de llamada pasa el mismo cdigo de solicitud que usted pas a <code>requestPermissions()</code>. 582 583 Por ejemplo, si una aplicacin solicita acceso <code>READ_CONTACTS</code>, es posible que tenga el siguiente mtodo de devolucin de llamada: 584 585 586 </p> 587 588 <pre> 589 @Override 590 public 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 aplicacin 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 podra desactivar cualquier accin 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 opcin de indicarle al sistema que no solicite ese permiso de nuevo. 622 En ese caso, cuando la aplicacin 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 hara si el usuario hubiese rechazado explcitamente su solicitud nuevamente. 625 626 Por esta razn, su aplicacin no puede asumir que se ha llevado a cabo algn tipo de interaccin con el usuario. 627 628 </p> 629 630 <h2 id="testing">Prueba de permisos de tiempo de ejecucin</h2> 631 632 633 <p> 634 Si su aplicacin tiene como destino M Developer Preview, debe probar que administre los permisos correctamente. 635 No debe asumir que su aplicacin tiene algn permiso en particular cuando se ejecuta. 636 Cuando la aplicacin 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 aplicacin para asegurarse de que funciona correctamente en todas las situaciones de permisos. 643 Con el SDK de la versin preliminar de Android M, hemos brindado nuevos comandos <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (adb)</a> que le permitirn probar su aplicacin con cualquier configuracin 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 versin preliminar de Android M contienen varios comandos nuevos que le permiten probar la manera en que su aplicacin administra los permisos. 655 656 </p> 657 658 <h4> 659 Instalar con permisos 660 </h4> 661 662 <p> 663 Puede utilizar la nueva opcin <code>-g</code> del comando <a href="{@docRoot}tools/help/adb.html#move"><code>adb 664 install</code></a>, que instala la aplicacin y concede todos los permisos enumerados en el manifiesto de la aplicacin: 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 aplicacin instalada. Esta funcionalidad puede resultar til para pruebas automticas. 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 prcticas</h2> 708 709 <p> 710 El nuevo modelo de permisos brinda a los usuarios una experiencia ms fluida y les facilita la instalacin de aplicaciones, adems de hacerlos sentir cmodos con las actividades de sus aplicaciones. 711 712 Sugerimos las siguientes mejores prcticas 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 decisin. 721 La funcionalidad de su aplicacin 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 aplicacin puede obtener la funcionalidad necesaria a travs de un <a href="{@docRoot}guide/components/intents-filters.html">intento</a> en lugar de una solicitud de permiso. 727 728 Si su aplicacin necesita tomar fotografas con la cmara del telfono, la aplicacin puede utilizar un intento {@link 729 android.provider.MediaStore#ACTION_IMAGE_CAPTURE 730 MediaStore.ACTION_IMAGE_CAPTURE}. 731 Cuando su aplicacin ejecuta el intento, el sistema le solicita al usuario que elija una aplicacin para la cmara que ya est instalada a fin de tomar la fotografa. 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 aplicacin. Por el contrario, debe pedir permisos en la medida que los necesite. 742 743 744 </p> 745 746 <p> 747 A veces, uno o ms permisos pueden ser absolutamente necesarios para la aplicacin. En ese caso, es recomendable pedir todos los permisos no bien se inicie la aplicacin. 748 749 Por ejemplo, si crea una aplicacin de fotografa, la aplicacin necesitar acceso a la cmara del dispositivo. 750 Cuando el usuario inicie la aplicacin por primera vez, no se sorprender si la aplicacin le solicita permiso para usar la cmara. 751 752 Sin embargo, si la misma aplicacin adems tuviese una caracterstica para compartir fotografas 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 caracterstica compartir para solicitar el permiso en ese momento. 755 756 </p> 757 758 <p> 759 Si su aplicacin proporciona un tutorial, se recomienda que se pidan los permisos esenciales de la aplicacin 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 dilogo de permisos que muestra el sistema cuando llama a 769 <code>requestPermissions()</code> informa qu permisos necesita su aplicacin 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 aplicacin necesita esos permisos antes de llamar a <code>requestPermissions()</code>. 772 773 </p> 774 775 <p> 776 Por ejemplo, una aplicacin de fotografa puede solicitar servicios de ubicacin para aadir una etiqueta geogrfica a las fotografas. 777 Es posible que un usuario tpico no sepa que una fotografa puede contener informacin sobre la ubicacin y se confundira si una aplicacin de fotografa solicita la ubicacin. 778 779 En este caso, es recomendable que la aplicacin le informe al usuario acerca de esta caracterstica <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 aplicacin. El tutorial puede mostrar todas las caractersticas de la aplicacin, una por vez, y mientras lo hace explicar los permisos que son necesarios. 786 787 Por ejemplo, el tutorial de la aplicacin de fotografa puede mostrar la caracterstica compartir fotografas con contactos y luego explicarle al usuario que debe otorgar permisos para que la aplicacin vea los contactos del usuario. 788 789 790 La aplicacin 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 aplicacin. 792 793 794 </p> 795