Update untuk penyimpanan di Android 11

Android 11 memberikan penyempurnaan lebih lanjut pada platform ini, menghadirkan perlindungan yang lebih baik pada aplikasi dan data pengguna di penyimpanan eksternal. Rilis pratinjau memperkenalkan beberapa penyempurnaan yang telah diumumkan tahun lalu di Android Dev Summit, seperti opsi penggunaan akses jalur file mentah untuk media, operasi edit banyak untuk media, dan UI yang diperbarui untuk Framework Akses Penyimpanan.

Untuk mempermudah proses peralihan ke penyimpanan terbatas, platform ini memperkenalkan penyempurnaan lebih lanjut untuk developer. Untuk mempelajari lebih lanjut cara memigrasikan aplikasi agar menggunakan penyimpanan terbatas berdasarkan kasus penggunaan aplikasi, lihat bagian penyimpanan terbatas di halaman ini, serta panduan kasus penggunaan dan praktik terbaik penyimpanan Android.

Seperti biasa, kami mengundang Anda untuk memberikan masukan guna membantu menyempurnakan versi Android berikutnya. Gunakan issue tracker untuk menyampaikan komentar Anda kepada kami.

Kami menantikan masukan Anda. Selesaikan survei singkat ini untuk menyampaikan pengalaman Anda dalam menggunakan fitur ini. Khususnya, beri tahu kami tentang kasus penggunaan yang terdampak oleh fitur ini.

Penerapan penyimpanan terbatas

Guna memberikan waktu tambahan bagi developer untuk melakukan pengujian, aplikasi yang menargetkan Android 10 (API level 29) masih dapat meminta atribut requestLegacyExternalStorage. Tanda ini memungkinkan aplikasi untuk tidak disertakan sementara dalam perubahan terkait penyimpanan terbatas, seperti memberikan akses ke berbagai direktori dan jenis file media yang berbeda. Setelah Anda mengupdate aplikasi untuk menargetkan Android 11, sistem akan mengabaikan tanda requestLegacyExternalStorage.

Mempertahankan kompatibilitas dengan Android 10

Jika aplikasi Anda tidak diikutsertakan untuk menggunakan penyimpanan terbatas saat berjalan di perangkat Android 10, lanjutkan untuk menetapkan requestLegacyExternalStorage ke true dalam file manifes aplikasi. Dengan demikian, aplikasi Anda dapat terus berperilaku seperti yang diharapkan pada perangkat yang menjalankan Android 10.

Memigrasikan data ke direktori yang terlihat saat menggunakan penyimpanan terbatas

Jika aplikasi Anda menggunakan model penyimpanan lama dan sebelumnya menargetkan Android 10 atau yang lebih rendah, Anda mungkin menyimpan data dalam direktori yang tidak dapat diakses oleh aplikasi saat penyimpanan terbatas diaktifkan. Sebelum menargetkan Android 11, migrasikan data ke direktori yang kompatibel dengan penyimpanan terbatas. Biasanya, Anda dapat memigrasikan data ke direktori khusus aplikasi Anda.

Jika memiliki data yang perlu dimigrasikan, Anda dapat mempertahankan model penyimpanan lama saat pengguna mengupgrade aplikasi Anda ke versi baru yang menargetkan Android 11. Dengan demikian, pengguna tetap dapat mengakses data aplikasi yang disimpan dalam direktori tempat aplikasi Anda sebelumnya menyimpan data. Untuk mengaktifkan model penyimpanan lama untuk upgrade, tetapkan atribut preserveLegacyExternalStorage ke true dalam manifes aplikasi Anda.

Catatan: Sebagian besar aplikasi seharusnya tidak perlu menggunakan preserveLegacyExternalStorage. Tanda ini dirancang hanya untuk situasi ketika Anda memigrasikan data aplikasi ke lokasi yang kompatibel dengan penyimpanan terbatas, dan Anda ingin pengguna tetap dapat mengakses data tersebut saat mengupdate aplikasi Anda. Tanda ini mempersulit proses pengujian untuk mengetahui pengaruh penyimpanan terbatas terhadap pengguna aplikasi, karena saat pengguna mengupdate aplikasi, model penyimpanan lama tetap akan digunakan.

Jika Anda menggunakan preserveLegacyExternalStorage, model penyimpanan lama akan tetap berlaku hingga pengguna meng-uninstal aplikasi Anda. Jika pengguna menginstal atau menginstal ulang aplikasi di perangkat yang menjalankan Android 11, aplikasi tidak dapat memilih untuk tidak menggunakan model penyimpan terbatas, terlepas dari nilai preserveLegacyExternalStorage.

Menguji penyimpanan terbatas

Untuk mengaktifkan penyimpanan terbatas di aplikasi Anda, terlepas dari nilai tanda manifes dan versi SDK targetnya, aktifkan tanda kompatibilitas aplikasi berikut:

Untuk menonaktifkan penyimpanan terbatas dan menggunakan model penyimpanan lama, batalkan penetapan kedua tanda.

Mengelola penyimpanan perangkat

Pada Android 11, aplikasi yang menggunakan model penyimpanan terbatas hanya dapat mengakses file cache khusus aplikasi miliknya sendiri. Jika aplikasi Anda perlu mengelola penyimpanan perangkat, lakukan hal berikut:

  1. Periksa kapasitas ruang penyimpanan yang tersedia dengan memanggil tindakan intent ACTION_MANAGE_STORAGE.
  2. Jika kapasitas ruang penyimpanan yang tersedia tidak mencukupi, minta pengguna untuk mengizinkan aplikasi Anda menghapus semua cache. Untuk melakukannya, panggil tindakan intent ACTION_CLEAR_APP_CACHE.

Direktori khusus aplikasi di penyimpanan eksternal

Di Android 11, aplikasi tidak dapat membuat direktori khusus aplikasi di penyimpanan eksternal. Untuk mengakses direktori yang disediakan oleh sistem untuk aplikasi Anda, panggil getExternalFilesDirs().

Akses file media

Untuk mempermudah akses media sekaligus mempertahankan privasi pengguna, Android 11 menambahkan kemampuan berikut ini.

Menjalankan operasi batch

Agar konsisten di seluruh perangkat dan untuk meningkatkan kenyamanan pengguna, Android 11 menambahkan beberapa metode ke MediaStore API. Metode ini sangat berguna bagi aplikasi yang menginginkan alur sederhana untuk memodifikasi file media tertentu, seperti pengeditan foto secara langsung.

Metode yang ditambahkan adalah sebagai berikut:

createWriteRequest()
Meminta pengguna memberi aplikasi Anda akses tulis ke grup file media tertentu.
createFavoriteRequest()
Meminta pengguna untuk menandai file media tertentu sebagai beberapa media “favorit” mereka di perangkat. Semua aplikasi yang memiliki akses baca ke file ini dapat mengetahui bahwa pengguna telah menandai file sebagai “favorit”.
createTrashRequest()

Meminta pengguna untuk memindahkan file media tertentu ke tempat sampah perangkat. Item di tempat sampah akan dihapus secara permanen setelah jangka waktu yang ditentukan sistem.

createDeleteRequest()

Meminta pengguna untuk langsung menghapus file media tertentu secara permanen, tanpa memindahkannya ke tempat sampah terlebih dahulu.

Setelah memanggil salah satu metode ini, sistem akan membuat objek PendingIntent. Setelah aplikasi memanggil intent ini, pengguna akan melihat dialog yang meminta izin mereka agar aplikasi dapat memperbarui atau menghapus file media yang telah ditentukan.

Sebagai contoh, berikut cara membuat struktur panggilan ke createWriteRequest():

Kotlin

val urisToModify = /* A collection of content URIs to modify. */
val editPendingIntent = MediaStore.createWriteRequest(contentResolver,
        urisToModify)

// Launch a system prompt requesting user permission for the operation.
startIntentSenderForResult(editPendingIntent.intentSender, EDIT_REQUEST_CODE,
    null, 0, 0, 0)

Java

List<Uri> urisToModify = /* A collection of content URIs to modify. */
PendingIntent editPendingIntent = MediaStore.createWriteRequest(contentResolver,
                  urisToModify);

// Launch a system prompt requesting user permission for the operation.
startIntentSenderForResult(editPendingIntent.getIntentSender(),
    EDIT_REQUEST_CODE, null, 0, 0, 0);

Evaluasi respons pengguna lalu lanjutkan proses, atau jika pengguna tidak memberikan izin, jelaskan mengapa aplikasi Anda memerlukan izin tersebut:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int,
                 data: Intent?) {
    ...
    when (requestCode) {
        EDIT_REQUEST_CODE ->
            if (resultCode == Activity.RESULT_OK) {
                /* Edit request granted; proceed. */
            } else {
                /* Edit request not granted; explain to the user. */
            }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode,
                   @Nullable Intent data) {
    ...
    if (requestCode == EDIT_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            /* Edit request granted; proceed. */
        } else {
            /* Edit request not granted; explain to the user. */
        }
    }
}

Anda dapat menggunakan pola umum yang sama dengan createFavoriteRequest(), createTrashRequest(), dan createDeleteRequest().

Mengakses file menggunakan jalur file langsung dan library native

Untuk membantu aplikasi berfungsi secara lebih lancar dengan library media pihak ketiga, Android 11 memungkinkan Anda mengakses file media yang dikaitkan dengan aplikasi Anda melalui dua cara berikut:

  • File API.
  • Library native, seperti fopen().

Jika memiliki izin READ_EXTERNAL_STORAGE, aplikasi Anda dapat mengakses semua file media, baik file tersebut dikaitkan dengan aplikasi Anda maupun tidak.

Jika Anda mengakses file media menggunakan File API atau library native, sebaiknya jangan memilih untuk menggunakan penyimpanan terbatas, dengan menetapkan requestLegacyExternalStorage ke true dalam file manifes aplikasi Anda. Dengan demikian, aplikasi akan berperilaku seperti yang diharapkan pada perangkat yang menjalankan Android 10.

Akses ke direktori pribadi aplikasi lain

Di Android 11, aplikasi tidak dapat lagi mengakses file dalam direktori tetap khusus aplikasi milik aplikasi lain mana pun di penyimpanan eksternal.

Pembatasan akses dokumen

Guna memberikan waktu bagi developer untuk melakukan pengujian, perubahan terkait Framework Akses Penyimpanan (SAF) berikut ini hanya berlaku jika aplikasi Anda menargetkan Android 11.

Akses ke direktori

Anda tidak dapat lagi menggunakan tindakan intent ACTION_OPEN_DOCUMENT_TREE untuk meminta akses ke direktori berikut:

  • Direktori utama volume penyimpanan internal.
  • Direktori utama setiap volume kartu SD yang oleh produsen perangkat dianggap dapat diandalkan, baik kartu tersebut dapat diemulasi maupun dapat dilepas. Volume yang andal adalah volume yang sering kali dapat diakses tanpa masalah oleh aplikasi.
  • Direktori Download.

Akses ke file

Anda tidak dapat lagi menggunakan tindakan intent ACTION_OPEN_DOCUMENT_TREE atau ACTION_OPEN_DOCUMENT untuk meminta pengguna memilih file individu dari direktori berikut:

  • Direktori Android/data/ dan semua subdirektorinya.
  • Direktori Android/obb/ dan semua subdirektorinya.

Menguji perubahan

Untuk menguji perubahan perilaku ini, lakukan langkah berikut:

  1. Panggil intent dengan tindakan ACTION_OPEN_DOCUMENT. Pastikan direktori Android/data/ dan Android/obb/ tidak muncul.
  2. Lakukan salah satu langkah berikut:
  3. Panggil intent dengan tindakan ACTION_OPEN_DOCUMENT_TREE. Pastikan apakah direktori Download muncul dan tombol tindakan yang terkait dengan direktori tersebut berwarna abu-abu.

Izin

Android 11 memperkenalkan perubahan berikut ini terkait izin penyimpanan.

Menargetkan versi apa pun

Dialog pertama menampilkan link yang disebut Izinkan di setelan
Gambar 1. Dialog yang ditampilkan saat aplikasi menggunakan penyimpanan terbatas dan meminta izin READ_EXTERNAL_STORAGE.

Perubahan berikut diberlakukan di Android 11, terlepas dari versi SDK target aplikasi Anda:

  • Izin waktu proses Penyimpanan diubah namanya menjadi File & Media.
  • Jika aplikasi Anda masih menggunakan penyimpanan terbatas lalu meminta izin READ_EXTERNAL_STORAGE, pengguna akan melihat dialog yang berbeda dengan yang muncul di Android 10. Dialog tersebut menunjukkan bahwa aplikasi Anda meminta akses ke foto dan media, seperti pada Gambar 1.

    Pengguna dapat melihat aplikasi yang memiliki izin READ_EXTERNAL_STORAGE di setelan sistem. Di halaman Setelan > Privasi > Pengelola izin > File dan media, setiap aplikasi yang memiliki izin akan tercantum di bagian Diizinkan untuk semua file.

    Catatan: Jika aplikasi Anda menargetkan Android 11, perlu diingat bahwa akses ke "semua file" bersifat hanya baca. Untuk membaca dan menulis ke semua file di penyimpanan bersama menggunakan aplikasi ini, Anda harus memiliki izin akses semua file.

Menargetkan Android 11

Jika aplikasi Anda menargetkan Android 11, baik izin WRITE_EXTERNAL_STORAGE maupun izin hak istimewa WRITE_MEDIA_STORAGE tidak lagi menyediakan akses tambahan apa pun.

Perlu diingat bahwa pada perangkat yang menjalankan Android 10 (API level 29) atau yang lebih tinggi, aplikasi Anda dapat berkontribusi ke koleksi media yang ditentukan dengan baik, seperti MediaStore.Downloads, tanpa meminta izin apa pun terkait penyimpanan. Pelajari lebih lanjut cara meminta izin yang diperlukan saja saat menangani file media di aplikasi Anda.

Akses semua file

Beberapa aplikasi memiliki kasus penggunaan inti yang memerlukan akses file yang luas, seperti pengelolaan file atau operasi pencadangan dan pemulihan. Aplikasi dapat memperoleh izin akses semua file dengan melakukan hal berikut:

  1. Mendeklarasikan izin MANAGE_EXTERNAL_STORAGE.
  2. Menggunakan tindakan intent ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION untuk mengarahkan pengguna ke halaman setelan sistem tempat mereka dapat mengaktifkan opsi berikut untuk aplikasi Anda: Izinkan akses untuk mengelola semua file.

Untuk menentukan apakah aplikasi Anda telah diberi izin akses semua file, panggil Environment.isExternalStorageManager().

Izin akses semua file memberikan:

  • Akses baca dan tulis ke semua file dalam penyimpanan bersama.

  • Akses ke konten tabel MediaStore.Files.

  • Akses ke direktori utama drive OTG (on-the-go) USB dan kartu SD.

  • Akses tulis ke semua direktori penyimpanan internal⁠, kecuali untuk /Android/data/, /sdcard/Android, dan sebagian besar subdirektori /sdcard/Android. Akses tulis ini mencakup akses jalur file.

    Aplikasi yang diberi izin ini tetap tidak dapat mengakses direktori khusus aplikasi milik aplikasi lain karena direktori ini ditampilkan sebagai subdirektori Android/data/ pada volume penyimpanan.

Jika memiliki izin akses semua file, aplikasi dapat mengakses file dan direktori tambahan ini menggunakan MediaStore API atau jalur file. Namun, saat Anda menggunakan Framework Akses Penyimpanan, Anda hanya dapat mengakses file atau direktori jika dapat melakukannya tanpa izin akses semua file.

Untuk mempelajari izin khusus ini lebih lanjut, serta perubahan lain pada API penyimpanan Android di Android 11, lihat artikel Medium yang berjudul Modern User Storage on Android.