• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &gt;</strong>
191
192 <i>app_name</i> <strong>&gt; 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>&lt;uses-permission-sdk-m&gt;</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>&lt;uses-permission-sdk-m&gt;</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>&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 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>&lt;uses-permission-sdk-m&gt;</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&#64;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 &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 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 &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 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