Home | History | Annotate | Download | only in features
      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 &gt;</strong>
    191 
    192  <i>app_name</i> <strong>&gt; 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>&lt;uses-permission-sdk-m&gt;</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>&lt;uses-permission-sdk-m&gt;</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>&lt;uses-permission-sdk-m&gt;</code> se comporta al igual que
    348 <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</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>&lt;uses-permission-sdk-m&gt;</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 &#64;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 &lt;path_to_apk&gt;
    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 &lt;package_name&gt; &lt;permission_name&gt;
    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 &lt;package_name&gt; &lt;permission_name&gt;
    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