summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/es/preview/features/scoped-folder-access.jd
blob: 7a8c4c82cc80627475745366d742b0955f8e6309 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
page.title=Acceso a directorios determinados
page.keywords=preview,sdk,scoped directory access
page.tags=androidn

@jd:body

<div id="qv-wrapper">
<div id="qv">
  <h2>Contenido del documento</h2>
  <ol>
    <li><a href="#accessing">Acceder a un directorio de almacenamiento externo</a></li>
    <li><a href="#removable">Acceder a un directorio de un medio extraíble</a></li>
    <li><a href="#best">Prácticas recomendadas</a></li>
  </ol>
</div>
</div>

<p>Las aplicaciones como las aplicaciones de fotografía generalmente solo necesitan acceso a directorios de
almacenamiento externo, como el directorio <code>Pictures</code>. Los métodos
existentes para acceder a almacenamiento externo no están diseñados para brindar un
acceso fácil a determinados directorios para estos tipos de aplicaciones. Por ejemplo:</p>

<ul>
<li>Solicitar {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
o {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} en tu manifiesto
permite el acceso a todos los directorios públicos de un almacenamiento externo, lo cual podría ser
un acceso mayor que el que necesita tu aplicación.</li>
<li>Usar el
<a href="{@docRoot}guide/topics/providers/document-provider.html">framework
de acceso al almacenamiento</a> generalmente implica que el usuario seleccione directorios
mediante un sistema de IU, lo cual no es necesario si tu aplicación siempre accede al mismo
directorio externo.</li>
</ul>

<p>Android N brinda una API nueva y simplificada para acceder a
 directorios de almacenamiento externo comunes. </p>

<h2 id="accessing">Acceder a un directorio de almacenamiento externo</h2>

<p>Usa la clase <code>StorageManager</code> para obtener la instancia de
<code>StorageVolume</code> correcta. Luego, crea una intención llamando al
 método <code>StorageVolume.createAccessIntent()</code> de esa instancia.
Usa esta intención para acceder a directorios de almacenamiento externo. Para obtener una lista de
todos los volúmenes disponibles, incluidos los volúmenes de medios extraíbles, usa 
<code>StorageManager.getVolumesList()</code>.</p>

<p>El siguiente fragmento de código es un ejemplo de cómo abrir el
directorio <code>Pictures</code> en el almacenamiento compartido principal:</p>

<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>

<p>El sistema intenta otorgar acceso al directorio externo y, si
es necesario, confirma el acceso con el usuario usando una IU simplificada:</p>

<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>Imagen 1.</strong> Una aplicación solicitando
acceso al directorio Pictures.</p>

<p>Si el usuario otorga el acceso, el sistema llama a tu
 invalidación de <code>onActivityResult()</code> con un código resultante de
<code>Activity.RESULT_OK</code> y datos de intención que contienen el URI. Usa
el URI brindado para acceder a la información del directorio. Es similar a usar URI
generados por el
<a href="{@docRoot}guide/topics/providers/document-provider.html">framework
de acceso al almacenamiento</a>.</p>

<p>Si el usuario no otorga el acceso, el sistema llama a tu
invalidación de <code>onActivityResult()</code> con un código resultante de
<code>Activity.RESULT_CANCELED</code> y datos de intención nulos.</p>

<p class="note"><b>Nota</b>: obtener acceso a un directorio externo específico
también otorga el acceso a los subdirectorios de ese directorio.</p>

<h2 id="removable">Acceder a un directorio de un medio extraíble</h2>

<p>Para usar el acceso a directorios determinados para acceder a directorios de medios extraíbles,
primero debes agregar un {@link android.content.BroadcastReceiver} que escuche la
notificación{@link android.os.Environment#MEDIA_MOUNTED}, por ejemplo:</p>

<pre>
&lt;receiver
    android:name=".MediaMountedReceiver"
    android:enabled="true"
    android:exported="true" &gt;
    &lt;intent-filter&gt;
        &lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
        &lt;data android:scheme="file" /&gt;
    &lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>

<p>Cuando el usuario conecta un medio extraíble, como una tarjeta SD, el sistema envía una
notificación{@link android.os.Environment#MEDIA_MOUNTED}. Esta notificación
brinda un objeto <code>StorageVolume</code> en los datos de intención que puedes
usar para acceder a directorios del medio extraíble. El siguiente ejemplo
accede al directorio <code>Pictures</code> de medios extraíbles:</p>

<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
    mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>

<h2 id="best">Prácticas recomendadas</h2>

<p>Cuando sea posible, sigue usando el URI de acceso a directorios externos de modo que no tengas
que solicitarle acceso al usuario continuamente. Una vez que el usuario haya otorgado el acceso, llama a
<code>getContentResolver().takePersistableUriPermssion()</code> con el
URI de acceso a directorios. El sistema continuará el URI, y las siguientes solicitudes
de acceso generarán <code>RESULT_OK</code> y no le mostrarán una IU de confirmación al
usuario.</p>

<p>Si el usuario deniega el acceso a un directorio externo, no vuelvas a solicitar el
acceso inmediatamente. Hacer esto provocaría una mala experiencia
de usuario.</p>