page.title=Scoped Directory Access page.keywords=preview,sdk,scoped directory access page.tags=androidn @jd:body
Aplikasi seperti aplikasi foto biasanya hanya memerlukan akses ke direktori tertentu dalam
penyimpanan eksternal, seperti direktori Pictures. Pendekatan
yang ada untuk mengakses penyimpanan eksternal tidak didesain untuk memberikan
akses direktori target dengan mudah untuk tipe aplikasi ini. Misalnya:
Android N menyediakan API baru yang disederhanakan untuk mengakses direktori penyimpanan eksternal umum.
Gunakan kelas StorageManager untuk mendapatkan instance
StorageVolume yang tepat. Kemudian, buat intent dengan memanggil metode
StorageVolume.createAccessIntent() dari instance itu.
Gunakan intent ini untuk mengakses direktori penyimpanan eksternal. Untuk mendapatkan daftar
semua isi yang tersedia, termasuk isi media lepas-pasang, gunakan
StorageManager.getVolumesList().
Cuplikan kode berikut adalah contoh cara membuka direktori
Pictures dalam penyimpanan bersama utama:
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); StorageVolume volume = sm.getPrimaryVolume(); Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); startActivityForResult(intent, request_code);
Sistem ini mencoba untuk memberikan akses ke direktori eksternal, dan jika diperlukan mengonfirmasi akses dengan pengguna menggunakan UI yang disederhanakan:
Gambar 1. Sebuah aplikasi yang meminta akses ke direktori Pictures.
Jika pengguna memberi akses, sistem akan memanggil pengesampingan
onActivityResult() Anda dengan kode hasil
Activity.RESULT_OK, dan data intent yang berisi URI. Gunakan
URI yang disediakan untuk mengakses informasi direktori, serupa dengan menggunakan URI
yang dikembalikan oleh
Storage
Access Framework.
Jika pengguna tidak memberi akses, sistem akan memanggil pengesampingan
onActivityResult() Anda dengan kode hasil
Activity.RESULT_CANCELED, dan data intent nol.
Catatan: Mendapatkan akses ke direktori eksternal tertentu juga akan memperoleh akses ke subdirektori dalam direktori tersebut.
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:
<receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
Bila pengguna memasang media lepas-pasang, seperti kartu SD, sistem akan mengirimkan pemberitahuan
{@link android.os.Environment#MEDIA_MOUNTED}. Pemberitahuan ini
memberikan sebuah objek StorageVolume dalam data intent yang bisa
Anda gunakan untuk mengakses direktori pada media lepas-pasang. Contoh berikut
mengakses direktori Pictures pada media lepas-pasang:
// 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);
Bila memungkinkan, pertahankan URI akses direktori eksternal sehingga Anda tidak perlu
berulang kali meminta akses ke pengguna. Setelah pengguna memberikan akses, panggil
getContentResolver().takePersistableUriPermssion() bersama
URI akses direktori. Sistem akan mempertahankan URI dan permintaan
akses berikutnya akan mengembalikan RESULT_OK dan tidak menampilkan UI konfirmasi kepada
pengguna.
Jika pengguna menolak akses ke direktori eksternal, jangan langsung meminta akses lagi. Berulang kali meminta akses akan menghasilkan pengalaman pengguna yang buruk.