Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Kasus penggunaan dan praktik terbaik penyimpanan Android

Untuk memberi pengguna kontrol yang lebih besar terhadap file dan membatasi file yang tidak berfungsi, Android 10 memperkenalkan model penyimpanan baru untuk aplikasi yang disebut penyimpanan terbatas. Penyimpanan terbatas mengubah cara aplikasi menyimpan dan mengakses file di penyimpanan eksternal perangkat. Untuk membantu Anda memigrasikan aplikasi guna mendukung penyimpanan terbatas, ikuti praktik terbaik untuk kasus penggunaan penyimpanan umum yang dijelaskan dalam panduan ini. Kasus penggunaan disusun dalam dua kategori: menangani file media dan menangani file non-media.

Untuk mempelajari lebih lanjut tentang cara menyimpan dan mengakses file di Android, lihat panduan pelatihan penyimpanan.

Menangani file media

Bagian ini menjelaskan beberapa kasus penggunaan umum untuk menangani file media (file video, gambar, dan audio) serta menjelaskan pendekatan tingkat tinggi yang dapat digunakan aplikasi Anda. Tabel berikut meringkas setiap kasus penggunaan tersebut, dan menautkan ke setiap bagian yang berisi detail lebih lanjut.

Kasus penggunaan Ringkasan
Menampilkan semua file gambar atau video Gunakan pendekatan yang sama untuk semua versi Android.
Menampilkan gambar atau video dari folder tertentu Gunakan pendekatan yang sama untuk semua versi Android.
Mengakses informasi lokasi dari foto Gunakan satu pendekatan jika aplikasi Anda menggunakan penyimpanan terbatas. Gunakan pendekatan lain jika aplikasi memilih untuk tidak menggunakan penyimpanan terbatas.
Memodifikasi atau menghapus beberapa file media dalam satu operasi Gunakan satu pendekatan untuk Android 11. Untuk Android 10, pilih untuk tidak menggunakan penyimpanan terbatas dan sebagai gantinya, gunakan pendekatan untuk Android 9 dan yang lebih rendah.
Mengimpor satu gambar yang sudah ada Gunakan pendekatan yang sama untuk semua versi Android.
Mengambil satu gambar Gunakan pendekatan yang sama untuk semua versi Android.
Berbagi file media dengan aplikasi lain Gunakan pendekatan yang sama untuk semua versi Android.
Berbagi file media dengan aplikasi tertentu Gunakan pendekatan yang sama untuk semua versi Android.
Mengakses file dari kode atau library yang menggunakan jalur file langsung Gunakan satu pendekatan untuk Android 11. Untuk Android 10, pilih untuk tidak menggunakan penyimpanan terbatas dan sebagai gantinya, gunakan pendekatan untuk Android 9 dan yang lebih rendah.

Menampilkan file gambar atau video dari beberapa folder

Buat kueri koleksi media menggunakan query() API. Untuk memfilter atau mengurutkan file media, sesuaikan parameter projection, selection, selectionArgs, dan sortOrder.

Menampilkan gambar atau video dari folder tertentu

Gunakan pendekatan ini:

  1. Mengikuti praktik terbaik yang dijelaskan dalam Meminta Izin Aplikasi, minta izin READ_EXTERNAL_STORAGE.
  2. Mengambil file media berdasarkan nilai MediaColumns.DATA, yang berisi jalur sistem file absolut ke item media pada disk.

Mengakses Informasi lokasi dari foto

Jika aplikasi Anda menggunakan penyimpanan terbatas, ikuti langkah-langkah di bagian Informasi lokasi di foto dalam panduan penyimpanan media.

Mengubah atau menghapus beberapa file media dalam satu operasi

Sertakan logika berdasarkan versi Android yang digunakan aplikasi Anda.

Berjalan di Android 11

Gunakan pendekatan ini:

  1. Buat intent yang tertunda untuk permintaan tulis atau hapus permintaan menggunakan MediaStore.createWriteRequest() atau MediaStore.createTrashRequest(), lalu minta pengguna izin untuk mengedit serangkaian file dengan memanggil Intent tersebut.
  2. Evaluasi respons pengguna:

    • Jika izin diberikan, lanjutkan dengan memodifikasi atau menghapus operasi.
    • Jika izin tidak diberikan, jelaskan kepada pengguna mengapa fitur di aplikasi Anda memerlukan izin.

Pelajari lebih lanjut cara melakukan operasi batch menggunakan metode yang tersedia di Android 11.

Berjalan di Android 10

Jika aplikasi Anda menargetkan Android 10 (API level 29), pilih untuk tidak menggunakan penyimpanan terbatas dan lanjutkan menggunakan pendekatan untuk Android 9 dan yang lebih rendah untuk menjalankan operasi ini.

Berjalan di Android 9 atau yang lebih rendah

Gunakan pendekatan ini:

  1. Mengikuti praktik terbaik yang dijelaskan dalam Meminta Izin Aplikasi, minta izin WRITE_EXTERNAL_STORAGE.
  2. Gunakan MediaStore API untuk memodifikasi atau menghapus file media.

Mengimpor satu gambar yang sudah ada

Saat Anda ingin mengimpor satu gambar yang sudah ada (misalnya, untuk digunakan sebagai foto untuk profil pengguna), aplikasi Anda dapat menggunakan UI-nya sendiri untuk operasi, atau menggunakan pemilih sistem.

Menyajikan antarmuka pengguna Anda sendiri

Gunakan pendekatan ini:

  1. Mengikuti praktik terbaik yang dijelaskan dalam Meminta Izin Aplikasi, minta izin READ_EXTERNAL_STORAGE.
  2. Gunakan query() API untuk mengkueri koleksi media.
  3. Tampilkan hasil di UI kustom aplikasi Anda.

Menggunakan alat pilih sistem

Gunakan intent ACTION_GET_CONTENT, yang meminta pengguna memilih gambar untuk diimpor.

Jika Anda ingin memfilter jenis gambar yang ditampilkan oleh pemilih sistem kepada pengguna, Anda dapat menggunakan setType() atau EXTRA_MIME_TYPES.

Mengambil satu gambar

Saat Anda ingin mengambil satu gambar untuk digunakan di aplikasi (misalnya, untuk digunakan sebagai foto profil pengguna), gunakan intent ACTION_IMAGE_CAPTURE untuk meminta pengguna mengambil foto menggunakan kamera perangkat. Sistem menyimpan foto yang diambil di tabel MediaStore.Images.

Berbagi file media dengan aplikasi lain

Gunakan metode insert() untuk menambahkan record secara langsung ke MediaStore. Untuk informasi selengkapnya, lihat bagian Menambahkan item dari panduan penyimpanan media.

Berbagi file media dengan aplikasi tertentu

Gunakan komponen FileProvider Android, seperti yang dijelaskan dalam panduan Menyiapkan berbagi file.

Mengakses file dari kode atau library yang menggunakan jalur file langsung

Sertakan logika berdasarkan versi Android yang digunakan aplikasi Anda.

Berjalan di Android 11

Gunakan pendekatan ini:

  1. Mengikuti praktik terbaik yang dijelaskan dalam Meminta Izin Aplikasi, minta izin READ_EXTERNAL_STORAGE.
  2. Akses file menggunakan jalur file langsung.

Untuk informasi selengkapnya, lihat Mengakses file menggunakan jalur mentah.

Berjalan di Android 10

Jika aplikasi Anda menargetkan Android 10 (API level 29), pilih untuk tidak menggunakan penyimpanan terbatas dan lanjutkan menggunakan pendekatan untuk Android 9 dan yang lebih rendah untuk menjalankan operasi ini.

Berjalan di Android 9 atau yang lebih rendah

Gunakan pendekatan ini:

  1. Mengikuti praktik terbaik yang dijelaskan dalam Meminta Izin Aplikasi, minta izin WRITE_EXTERNAL_STORAGE.
  2. Akses file menggunakan jalur file langsung.

Menangani file non-media

Bagian ini menjelaskan beberapa kasus penggunaan umum untuk menangani file non-media dan menjelaskan pendekatan tingkat tinggi yang dapat digunakan aplikasi Anda. Tabel berikut meringkas setiap kasus penggunaan tersebut, dan menautkan ke setiap bagian yang berisi detail lebih lanjut.

Kasus penggunaan Ringkasan
Membuka file dokumen Gunakan pendekatan yang sama untuk semua versi Android.
Memigrasikan file yang ada dari lokasi penyimpanan lawas Migrasikan file Anda ke penyimpanan terbatas jika memungkinkan. Pilih tidak menggunakan penyimpanan terbatas untuk Android 10 jika diperlukan.
Berbagi konten dengan aplikasi lain Gunakan pendekatan yang sama untuk semua versi Android.
Meng-cache file non-media Gunakan pendekatan yang sama untuk semua versi Android.

Membuka file dokumen

Gunakan intent ACTION_OPEN_DOCUMENT untuk meminta pengguna memilih file untuk dibuka menggunakan alat pilih sistem. Jika Anda ingin memfilter jenis file yang akan ditampilkan oleh alat pilih sistem kepada pengguna, Anda dapat menggunakan setType() atau EXTRA_MIME_TYPES.

Misalnya, Anda dapat menemukan semua file PDF, SQL, dan TXT menggunakan kode berikut:

Kotlin

startActivityForResult(
        Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
                    "application/pdf", // .pdf
                    "application/vnd.oasis.opendocument.text", // .odt
                    "text/plain" // .txt
            ))
        },
        REQUEST_CODE
      )

Java

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
                "application/pdf", // .pdf
                "application/vnd.oasis.opendocument.text", // .odt
                "text/plain" // .txt
        });
        startActivityForResult(intent, REQUEST_CODE);

Memigrasikan file yang sudah ada dari lokasi penyimpanan lama

Direktori dianggap sebagai lokasi penyimpanan lama jika bukan direktori khusus aplikasi atau direktori bersama publik. Jika aplikasi Anda membuat atau menggunakan file di lokasi penyimpanan lama, sebaiknya Anda memigrasikan file aplikasi ke lokasi yang dapat diakses dengan penyimpanan terbatas dan membuat perubahan aplikasi yang diperlukan untuk bekerja dengan file dalam cakupan yang terbatas.

Mempertahankan akses ke lokasi penyimpanan lama untuk migrasi data

Aplikasi Anda perlu mempertahankan akses ke lokasi penyimpanan lama untuk memigrasikan file aplikasi apa pun ke lokasi yang dapat diakses dengan penyimpanan terbatas. Pendekatan yang harus Anda gunakan bergantung pada level API target aplikasi Anda.

Jika aplikasi Anda menargetkan Android 11
  1. Gunakan tanda preserveLegacyExternalStorage untuk mempertahankan model penyimpanan lama sehingga aplikasi Anda dapat memigrasikan data pengguna saat mereka melakukan upgrade ke versi baru aplikasi Anda yang menargetkan Android 11.

  2. Lanjutkan untuk memilih tidak menggunakan penyimpanan terbatas sehingga aplikasi Anda dapat terus mengakses file di lokasi penyimpanan lama pada perangkat Android 10.

Jika aplikasi Anda menargetkan Android 10

Memilih tidak menggunakan penyimpanan terbatas untuk memudahkan Anda menjaga perilaku aplikasi di berbagai versi Android.

Memigrasikan data aplikasi

Saat aplikasi Anda siap dimigrasikan, gunakan pendekatan berikut:

  1. Periksa apakah file aplikasi Anda berfungsi di direktori /sdcard/ atau subdirektorinya.
  2. Pindahkan file aplikasi pribadi apa pun dari lokasi saat ini pada /sdcard/ ke direktori yang ditampilkan oleh metode getExternalFilesDir().
  3. Pindahkan file non-media yang dibagikan dari lokasi saat ini di bawah /sdcard/ ke subdirektori khusus aplikasi dari direktori Downloads/.
  4. Hapus direktori penyimpanan lama aplikasi Anda dari direktori /sdcard/.

Berbagi konten dengan aplikasi lain

Untuk berbagi file aplikasi dengan satu aplikasi lainnya, gunakan FileProvider. Untuk semua aplikasi yang perlu saling berbagi file, sebaiknya gunakan penyedia konten untuk setiap aplikasi, lalu sinkronkan data saat aplikasi ditambahkan ke koleksi.

Meng-cache file non-media

Pendekatan yang harus Anda gunakan bergantung pada jenis file yang perlu di-cache.

Memilih tidak menggunakan penyimpanan terbatas untuk sementara

Sebelum aplikasi Anda sepenuhnya kompatibel dengan penyimpanan terbatas, Anda dapat memilih tidak menggunakannya untuk sementara dengan menggunakan salah satu metode berikut:

  • Targetkan Android 9 (API level 28) atau yang lebih rendah.
  • Jika Anda menargetkan Android 10 (API level 29) atau yang lebih tinggi, tetapkan nilai requestLegacyExternalStorage ke true dalam file manifes aplikasi Anda:

    <manifest ... >
    <!-- This attribute is "false" by default on apps targeting
         Android 10 or higher. -->
      <application android:requestLegacyExternalStorage="true" ... >
        ...
      </application>
    </manifest>
    

Untuk menguji perilaku aplikasi yang menargetkan Android 9 atau yang lebih rendah saat menggunakan penyimpanan terbatas, Anda dapat memilih untuk menggunakan perilaku ini dengan menetapkan nilai requestLegacyExternalStorage ke false. Jika melakukan pengujian di perangkat Android 11, Anda juga dapat menggunakan tanda kompatibilitas aplikasi untuk menguji perilaku aplikasi dengan atau tanpa penyimpanan terbatas.