summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/in/preview/features/scoped-folder-access.jd
blob: cbb7c9fc11eae79bc1c71a926f19e46812f73d1d (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=Scoped Directory Access
page.keywords=preview,sdk,scoped directory access
page.tags=androidn

@jd:body

<div id="qv-wrapper">
<div id="qv">
  <h2>Dalam dokumen ini</h2>
  <ol>
    <li><a href="#accessing">Mengakses Direktori Penyimpanan Eksternal</a></li>
    <li><a href="#removable">Mengakses Direktori pada Media Lepas-Pasang</a></li>
    <li><a href="#best">Praktik Terbaik</a></li>
  </ol>
</div>
</div>

<p>Aplikasi seperti aplikasi foto biasanya hanya memerlukan akses ke direktori tertentu dalam
penyimpanan eksternal, seperti direktori <code>Pictures</code>. Pendekatan
yang ada untuk mengakses penyimpanan eksternal tidak didesain untuk memberikan
akses direktori target dengan mudah untuk tipe aplikasi ini. Misalnya:</p>

<ul>
<li>Meminta {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
atau {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} dalam manifes Anda
akan memungkinkan akses ke semua direktori publik pada penyimpanan eksternal, yang mungkin
lebih banyak akses dari yang dibutuhkan aplikasi Anda.</li>
<li>Penggunaan
<a href="{@docRoot}guide/topics/providers/document-provider.html">Storage
Access Framework</a> biasanya membuat pengguna Anda memilih direktori
melalui UI sistem, yang tidak diperlukan jika aplikasi Anda selalu mengakses
direktori eksternal yang sama.</li>
</ul>

<p>Android N menyediakan API baru yang disederhanakan untuk mengakses
direktori penyimpanan eksternal umum. </p>

<h2 id="accessing">Mengakses Direktori Penyimpanan Eksternal</h2>

<p>Gunakan kelas <code>StorageManager</code> untuk mendapatkan instance
<code>StorageVolume</code> yang tepat. Kemudian, buat intent dengan memanggil metode
<code>StorageVolume.createAccessIntent()</code> dari instance itu.
Gunakan intent ini untuk mengakses direktori penyimpanan eksternal. Untuk mendapatkan daftar
semua isi yang tersedia, termasuk isi media lepas-pasang, gunakan
<code>StorageManager.getVolumesList()</code>.</p>

<p>Cuplikan kode berikut adalah contoh cara membuka direktori
<code>Pictures</code> dalam penyimpanan bersama utama:</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>Sistem ini mencoba untuk memberikan akses ke direktori eksternal, dan jika
diperlukan mengonfirmasi akses dengan pengguna menggunakan UI yang disederhanakan:</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>Gambar 1.</strong> Sebuah aplikasi yang meminta
akses ke direktori Pictures.</p>

<p>Jika pengguna memberi akses, sistem akan memanggil pengesampingan
<code>onActivityResult()</code> Anda dengan kode hasil
<code>Activity.RESULT_OK</code>, dan data intent yang berisi URI. Gunakan
URI yang disediakan untuk mengakses informasi direktori, serupa dengan menggunakan URI
yang dikembalikan oleh
<a href="{@docRoot}guide/topics/providers/document-provider.html">Storage
Access Framework</a>.</p>

<p>Jika pengguna tidak memberi akses, sistem akan memanggil pengesampingan
<code>onActivityResult()</code> Anda dengan kode hasil
<code>Activity.RESULT_CANCELED</code>, dan data intent nol.</p>

<p class="note"><b>Catatan</b>: Mendapatkan akses ke direktori eksternal tertentu
juga akan memperoleh akses ke subdirektori dalam direktori tersebut.</p>

<h2 id="removable">Mengakses Direktori pada Media Lepas-Pasang</h2>

<p>Untuk menggunakan Scoped Directory Access guna mengakses direktori pada media lepas-pasang,
pertama tambahkan {@link android.content.BroadcastReceiver} yang akan mendengarkan pemberitahuan
{@link android.os.Environment#MEDIA_MOUNTED}, misalnya:</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>Bila pengguna memasang media lepas-pasang, seperti kartu SD, sistem akan mengirimkan pemberitahuan
{@link android.os.Environment#MEDIA_MOUNTED}. Pemberitahuan ini
memberikan sebuah objek <code>StorageVolume</code> dalam data intent yang bisa
Anda gunakan untuk mengakses direktori pada media lepas-pasang. Contoh berikut
mengakses direktori <code>Pictures</code> pada media lepas-pasang:</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">Praktik Terbaik</h2>

<p>Bila memungkinkan, pertahankan URI akses direktori eksternal sehingga Anda tidak perlu
berulang kali meminta akses ke pengguna. Setelah pengguna memberikan akses, panggil
<code>getContentResolver().takePersistableUriPermssion()</code> bersama
URI akses direktori. Sistem akan mempertahankan URI dan permintaan
akses berikutnya akan mengembalikan <code>RESULT_OK</code> dan tidak menampilkan UI konfirmasi kepada
pengguna.</p>

<p>Jika pengguna menolak akses ke direktori eksternal, jangan langsung
meminta akses lagi. Berulang kali meminta akses akan menghasilkan pengalaman
pengguna yang buruk.</p>