{"id":3803,"date":"2025-11-27T18:25:57","date_gmt":"2025-11-27T10:25:57","guid":{"rendered":"https:\/\/imastudio.com\/?p=3803"},"modified":"2025-11-27T18:25:58","modified_gmt":"2025-11-27T10:25:58","slug":"android-storage-permission-adaptation-guide","status":"publish","type":"post","link":"https:\/\/imastudio.com\/id\/blog\/android-storage-permission-adaptation-guide","title":{"rendered":"Panduan Adaptasi Izin Penyimpanan Android untuk Android 11+"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Ketika saya mencoba menerapkan persyaratan yang sangat sederhana \u2014 <strong>mengunduh gambar dan menyimpannya ke penyimpanan lokal<\/strong> \u2014semuanya tampak baik-baik saja pada awalnya.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Honor (Android 10) \u2013 berfungsi<\/li>\n\n\n\n<li>Redmi (Android 11) \u2013 berfungsi<\/li>\n\n\n\n<li>Xiaomi (Android 13) \u2013 berfungsi<\/li>\n\n\n\n<li><strong>Samsung (Android 13)<\/strong> \u2013 gagal total: dialog izin penyimpanan tidak akan pernah muncul<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Kode yang sama, fitur yang sama, tetapi satu perangkat di Android 13 menolak untuk menampilkan perintah izin. Begitulah cara tugas &quot;unduh gambar&quot; kecil ini berubah menjadi pendalaman <strong>Penyimpanan Berskala<\/strong> Dan <strong>KELOLA_PENYIMPANAN_EKSTERNAL<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Posting ini merangkum bagaimana saya mengadaptasi izin penyimpanan untuk <strong>Android 11 dan di atasnya<\/strong>, dan bagaimana saya menangani perilaku yang berbeda-beda di berbagai versi.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Bug: Dialog Izin Penyimpanan Tidak Pernah Muncul (Samsung Android 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Persyaratannya sederhana:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Unduh gambar dan simpan ke perangkat sehingga muncul di galeri.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Pada tiga perangkat pengujian saya:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kehormatan \u2013 Android 10 \u2192 Oke<\/li>\n\n\n\n<li>Redmi \u2013 Android 11 \u2192 Oke<\/li>\n\n\n\n<li>Xiaomi \u2013 Android 13 \u2192 Oke<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tapi pada suatu <strong>Perangkat Samsung yang menjalankan Android 13<\/strong>, sistem <strong>tidak pernah menampilkan dialog izin penyimpanan<\/strong>, tidak peduli bagaimana saya memintanya.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg\" alt=\"\" class=\"wp-image-3810\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-300x54.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-768x138.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134.jpeg 1277w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg\" alt=\"\" class=\"wp-image-3811\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-300x49.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-768x126.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1536x253.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139.jpeg 1806w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"174\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg\" alt=\"\" class=\"wp-image-3808\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-300x51.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-768x131.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1536x262.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150.jpeg 1879w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Awalnya saya pikir ini hanya keanehan OEM lainnya, tetapi setelah memeriksa perubahan izin penyimpanan di seluruh versi Android, saya menyadari bahwa saya mengandalkan perilaku yang secara efektif telah ditinggalkan di Android 13 saat menargetkan SDK 33.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Akar Masalah: WRITE\/READ_EXTERNAL_STORAGE Tidak Digunakan Lagi di Android 13 (SDK 33)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pada versi Android lama, kita cukup mendeklarasikan dua izin ini dalam manifes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>BACA_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n\n\n\n<li><code>TULIS_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">dan kemudian memintanya pada saat runtime bila diperlukan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Di Android 13 (SDK 33) dengan <strong>targetSdkVersion = 33<\/strong>, pendekatan itu mulai rusak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>TULIS_PENYIMPANAN_EKSTERNAL<\/code> adalah <strong>sudah tidak digunakan lagi dan tidak berguna sama sekali<\/strong> pada versi Android terbaru<\/li>\n\n\n\n<li>Jika Anda menambahkan <code>maxSdkVersion=32<\/code> untuk izin ini, mereka masih berfungsi di Android 11\/12<br>tapi mereka adalah <strong>diabaikan<\/strong> di Android 13 saat menargetkan 33<\/li>\n\n\n\n<li>Pada saat yang sama, Play Store mengharuskan aplikasi baru untuk menargetkan setidaknya SDK 33<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Jadi untuk Android 11+ kita harus beradaptasi dengan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Penyimpanan Berskala<\/strong><\/li>\n\n\n\n<li>Dan dalam beberapa kasus, izin khusus: <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>KELOLA_PENYIMPANAN_EKSTERNAL<\/strong> memberikan akses luas ke semua konten penyimpanan bersama (termasuk file non-media) pada aplikasi. <strong>bukan<\/strong> mengizinkan akses ke direktori pribadi aplikasi lain, tetapi masih dianggap sebagai izin yang sangat sensitif oleh Google Play.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Untuk mendukung versi Android yang berbeda, saya akhirnya membagi penanganan izin menjadi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sebelum Android 11 (API &lt; 30)<\/strong> \u2013 izin penyimpanan eksternal gaya lama<\/li>\n\n\n\n<li><strong>Android 11 dan di atasnya<\/strong> \u2013 Penyimpanan Berskala + penanganan khusus dengan <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> di tempat yang benar-benar dibutuhkan<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Adaptasi Langkah demi Langkah<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Mendeklarasikan MANAGE_EXTERNAL_STORAGE dalam Manifest<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Di dalam <code>AndroidManifest.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission\n    android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"\n    tools:ignore=\"ScopedStorage\" \/><\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f Catatan: Karena <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> Ini adalah izin sensitif, dan dibatasi di Google Play. Saya akan membahas alternatifnya nanti jika Anda hanya ingin menyimpan gambar.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Periksa Apakah Izin Diberikan<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">saya sudah menggunakan <strong>Izin Mudah<\/strong> untuk menyederhanakan pemeriksaan izin.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun checkPer(aktivitas: PreViewActivity): Boolean { kembalikan jika (Build.VERSION.SDK_INT &gt;= 30) { EasyPermissions.hasPermissions( aktivitas, android.Manifest.izin.KELOLA_PENYIMPANAN_EKSTERNAL ) } yang lain { EasyPermissions.hasPermissions( aktivitas, android.Manifest.izin.TULIS_PENYIMPANAN_EKSTERNAL ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pada <strong>Android 11+ (API &gt;= 30)<\/strong>: Saya periksa <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n\n\n\n<li>Pada <strong>Android 10 dan di bawahnya<\/strong>: Aku masih memeriksa <code>TULIS_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Perpecahan ini penting karena <code>TULIS_PENYIMPANAN_EKSTERNAL<\/code> tidak lagi berperilaku seperti pada versi yang lebih baru.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Meminta Izin Jika Tidak Ada<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jika izin tidak diberikan, saya memintanya secara berbeda berdasarkan versi sistem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun requestStoragePermission(activity: PreViewActivity, curImg: Int) { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.R) { \/\/ Android 11+ \u2013 dialihkan ke halaman pengaturan &quot;Akses semua file&quot; sistem val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse(&quot;package:&quot; + activity.packageName) activity.startActivityForResult(intent, 200) } else { \/\/ Android 10 dan versi sebelumnya \u2013 izin runtime normal val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE PaperThreeVariable.isToRequestPer = true EasyPermissions.requestPermissions( PermissionRequest.Builder( activity, 200, perm ).build() ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pada <strong>Android 11+<\/strong>:Anda tidak bisa begitu saja \u201cmemunculkan\u201d dialog runtime normal untuk <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code><br>Anda harus mengarahkan pengguna ke halaman pengaturan sistem tempat mereka secara manual memberikan \u201cAkses semua file\u201d.<\/li>\n\n\n\n<li>Pada <strong>Android 10 dan di bawahnya<\/strong>:Dialog izin runtime klasik masih berfungsi.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Menangani Panggilan Balik Izin<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">EasyPermissions membantu menjembatani panggilan balik Aktivitas dan logika kita sendiri:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mengganti fun onRequestPermissionsResult( requestCode: Int, permissions: Array , grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) } override fun onPermissionsGranted(requestCode: Int, perms: MutableList ) { AppInitUtils().saveFreshAppImageToGallery(ini, curImg) PaperThreeVariable.isToRequestPer = false } override fun onPermissionsDenied(requestCode: Int, perms: MutableList ) { PaperThreeVariable.isToRequestPer = false if (EasyPermissions.somePermissionPermanentlyDenied(ini, izin)) { AppSettingsDialog.Builder(ini) .setRationale(&quot;Fungsi ini memerlukan izin penyimpanan untuk diaktifkan&quot;) .setNegativeButton(&quot;Tidak&quot;) .setPositiveButton(&quot;Ya&quot;) .build() .show() } }\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mengapa saya menggunakan EasyPermissions di sini:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pengguna bisa <strong>menolak secara permanen<\/strong> izin, yang membuat permintaan berulang gagal secara diam-diam<\/li>\n\n\n\n<li>EasyPermissions memudahkan untuk:\n<ul class=\"wp-block-list\">\n<li>Mendeteksi status \u201cditolak secara permanen\u201d<\/li>\n\n\n\n<li>Tampilkan dialog yang memandu pengguna ke <strong>pengaturan sistem \u2192 izin aplikasi<\/strong> untuk mengaktifkan akses penyimpanan secara manual<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Setelah izin diberikan, saya memanggil:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AppInitUtils().saveFreshAppImageToGallery(ini, curImg)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">untuk benar-benar menyimpan gambar dan menyegarkan galeri.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Setelah adaptasi ini, perangkat Samsung Android 13 akhirnya berperilaku sama seperti yang lain.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Catatan tambahan: Perangkat Xiaomi saya melaporkan Android 13, tetapi &quot;perangkat terhubung historis&quot; di Android Studio mengenalinya sebagai Android 12. Hal itu mungkin menjelaskan mengapa hal itu masih berfungsi dalam beberapa kasus \u2014 tetapi inilah mengapa penanganan izin yang sadar versi itu penting.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Tentang MANAGE_EXTERNAL_STORAGE dan Pembatasan Google Play<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> sangat kuat:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Ini memberikan akses baca\/tulis ke <strong>semua penyimpanan bersama<\/strong> pada perangkat.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Oleh karena itu, Google Play memperlakukannya sebagai <strong>izin yang sangat sensitif<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ini terutama ditujukan untuk <strong>pengelola berkas \/ cadangan \/ antivirus<\/strong> aplikasi tipe<\/li>\n\n\n\n<li>Anda harus menyerahkan pembenaran untuk menggunakannya<\/li>\n\n\n\n<li>Jika aplikasi Anda hanya merupakan aplikasi konsumen biasa (misalnya, menyimpan gambar, unduhan sederhana), permintaan Anda kemungkinan besar akan <strong>ditolak<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Jadi jika satu-satunya persyaratan Anda adalah:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cSimpan gambar ke galeri dan buat agar terlihat oleh pengguna.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">maka kamu harus <strong>sangat mempertimbangkan untuk menghindari<\/strong> <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> dan sebagai gantinya:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Menggunakan <strong>Toko Media<\/strong> untuk memasukkan gambar ke dalam perpustakaan media sistem<\/li>\n\n\n\n<li>Atau gunakan API yang dapat menyimpan gambar tanpa memerlukan akses file penuh<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ada beberapa pola untuk:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simpan gambar ke direktori Pictures\/DCIM<\/li>\n\n\n\n<li>Beri tahu pemindai media atau andalkan MediaStore agar galeri dapat mengambilnya<\/li>\n\n\n\n<li>Lakukan semua ini <strong>tanpa meminta MANAGE_EXTERNAL_STORAGE<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Untuk distribusi internal atau non-Play Store (misalnya, toko aplikasi internal perusahaan), secara teknis Anda masih dapat menggunakan <code>Lingkungan.getExternalStorageDirectory()<\/code>, tetapi saya tidak menyarankan merancang aplikasi baru dengan dasar ini pada tahun 2025.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Ringkasan Versi demi Versi (Android 9 \u2192 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Untuk meletakkan semuanya di satu tempat, berikut adalah ringkasan tingkat tinggi tentang bagaimana penyimpanan eksternal dan izin berperilaku di berbagai versi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Android 9 dan di bawahnya (API 28 dan sebelumnya)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Izin<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>BACA_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n\n\n\n<li><code>TULIS_PENYIMPANAN_EKSTERNAL<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Perilaku<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Aplikasi dapat mengakses secara bebas <code>\/kartu sd<\/code> dan subdirektori-nya<\/li>\n\n\n\n<li>File yang dibuat oleh aplikasi tetap ada di perangkat bahkan setelah aplikasi dihapus instalasinya<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Pendekatan umum<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Langsung membaca\/menulis di jalur penyimpanan eksternal<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 10 (API 29) \u2013 Penyimpanan Berskala Diperkenalkan<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Izin<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>BACA_PENYIMPANAN_EKSTERNAL<\/code> masih berfungsi<\/li>\n\n\n\n<li><code>TULIS_PENYIMPANAN_EKSTERNAL<\/code> masih ada, namun cakupan efektifnya berkurang<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Perilaku<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Penyimpanan Berskala<\/strong> diperkenalkan:\n<ul class=\"wp-block-list\">\n<li>Aplikasi dibatasi pada direktori khusus aplikasi mereka sendiri di bawah<br><code>Android\/data\/nama.paket.Anda\/<\/code><\/li>\n\n\n\n<li>Akses langsung ke file aplikasi lain dibatasi<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>File media (gambar, video, audio) harus diakses melalui <strong>Toko Media<\/strong><\/li>\n\n\n\n<li><code>requestLegacyExternalStorage=benar<\/code> bisa mempertahankan perilaku lama untuk sementara<br>(tetapi bendera ini diabaikan mulai dari Android 11)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Pendekatan yang direkomendasikan<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Untuk gambar\/video\/audio: gunakan <strong>Toko Media<\/strong><\/li>\n\n\n\n<li>Untuk file pribadi: gunakan <code>getExternalFilesDir()<\/code> atau <code>dapatkanDataDir()<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 11 (API 30) \u2013 Penyimpanan Bercakupan Diberlakukan<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Izin<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>BACA_PENYIMPANAN_EKSTERNAL<\/code> berfungsi, tetapi hanya untuk media yang dikelola oleh MediaStore<\/li>\n\n\n\n<li><code>TULIS_PENYIMPANAN_EKSTERNAL<\/code> secara efektif <strong>usang<\/strong> untuk penyimpanan eksternal umum<\/li>\n\n\n\n<li><code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> diperkenalkan untuk kasus penggunaan khusus \u201cakses semua file\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Perilaku<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>requestLegacyExternalStorage=benar<\/code> tidak lagi berfungsi; Penyimpanan Berskala adalah <strong>selalu aktif<\/strong><\/li>\n\n\n\n<li>Akses ke <code>\/kartu sd\/<\/code> root diblokir<\/li>\n\n\n\n<li>Aplikasi hanya dapat:\n<ul class=\"wp-block-list\">\n<li>Mengakses direktori pribadi mereka sendiri<\/li>\n\n\n\n<li>Akses media bersama melalui <strong>Toko Media<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Pendekatan yang direkomendasikan<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Untuk aplikasi umum:\n<ul class=\"wp-block-list\">\n<li>Gunakan MediaStore atau <strong>SAF<\/strong> (<code>TINDAKAN_BUKA_DOKUMEN<\/code>, <code>TINDAKAN_BUAT_DOKUMEN<\/code>) untuk file yang dipilih pengguna<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Hanya pertimbangkan <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> jika aplikasi Anda benar-benar merupakan pengelola berkas, alat pencadangan, aplikasi keamanan, dll.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 13 (API 33) \u2013 Izin Media Terpisah<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Izin<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>BACA_GAMBAR_MEDIA<\/code> \u2013 akses gambar<\/li>\n\n\n\n<li><code>BACA_MEDIA_VIDEO<\/code> \u2013 akses video<\/li>\n\n\n\n<li><code>BACA_MEDIA_AUDIO<\/code> \u2013 akses audio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Perilaku<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Izin media adalah <strong>berbutir halus<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Pengguna hanya dapat memberikan akses gambar, hanya akses video, dan lain-lain.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Aturan Penyimpanan Berskala dari Android 11 tetap berlaku<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Pendekatan yang direkomendasikan<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Minta izin media spesifik yang Anda perlukan:\n<ul class=\"wp-block-list\">\n<li>Misalnya, jika Anda hanya bekerja dengan gambar, minta saja <code>BACA_GAMBAR_MEDIA<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Melakukan <strong>bukan<\/strong> meminta <code>BACA_PENYIMPANAN_EKSTERNAL<\/code> di Android 13+, karena digantikan oleh izin media baru<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Matriks Cepat (Konseptual)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Android 9 dan di bawahnya<\/strong>\n<ul class=\"wp-block-list\">\n<li>Akses ke penyimpanan eksternal luas, dikontrol oleh READ\/WRITE_EXTERNAL_STORAGE<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 10<\/strong>\n<ul class=\"wp-block-list\">\n<li>Penyimpanan Berskala diperkenalkan, tetapi ada jalan keluar (<code>permintaanLegacyExternalStorage<\/code>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 11<\/strong>\n<ul class=\"wp-block-list\">\n<li>Penyimpanan Bercakupan diberlakukan, sakelar lama dihapus<\/li>\n\n\n\n<li><code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> muncul tetapi sangat terbatas<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 13<\/strong>\n<ul class=\"wp-block-list\">\n<li>Akses media dibagi menjadi <code>BACA_MEDIA_*<\/code> izin<\/li>\n\n\n\n<li>Aturan Penyimpanan Bercakupan yang Sama, tetapi kontrol pengguna yang lebih terperinci<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Poin-poin Penting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jangan berasumsi bahwa &quot;berfungsi di satu perangkat Android 13&quot; berarti berfungsi di mana saja; OEM dan laporan sistem bisa saja tidak konsisten.<\/li>\n\n\n\n<li>Untuk <strong>Android 11+<\/strong>, pikirkan dalam hal:\n<ul class=\"wp-block-list\">\n<li><strong>Direktori pribadi aplikasi + MediaStore + SAF<\/strong>, tidak \u201cmentah\u201d <code>\/kartu sd<\/code> mengakses&quot;\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Merawat <code>KELOLA_PENYIMPANAN_EKSTERNAL<\/code> sebagai <strong>pilihan terakhir<\/strong> untuk jenis aplikasi yang sangat spesifik, terutama jika Anda berencana untuk menerbitkannya di Google Play.<\/li>\n\n\n\n<li>Selalu uji pada <strong>beberapa perangkat dan versi Android<\/strong>, terutama dalam hal izin dan penyimpanan.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Artikel ini berasal dari proses debugging dan adaptasi saya sendiri dalam proyek Android sungguhan (termasuk perangkat Samsung di Android 13). GPT hanya membantu menerjemahkan dan menyempurnakan kata-katanya; semua konten dan keputusan teknis adalah milik saya.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Ketika saya mencoba menerapkan persyaratan yang sangat sederhana \u2014 mengunduh gambar dan menyimpannya ke penyimpanan lokal \u2014 semuanya tampak baik-baik saja pada awalnya. Kode yang sama, fitur yang sama, tetapi satu perangkat di Android 13 menolak untuk menampilkan perintah izin. Begitulah bagaimana tugas kecil &quot;mengunduh gambar&quot; ini berubah menjadi pendalaman [\u2026]<\/p>","protected":false},"author":10,"featured_media":3804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"","rank_math_description":"","footnotes":""},"categories":[35],"tags":[],"class_list":["post-3803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledge-hub"],"_links":{"self":[{"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/posts\/3803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/comments?post=3803"}],"version-history":[{"count":4,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/posts\/3803\/revisions"}],"predecessor-version":[{"id":3812,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/posts\/3803\/revisions\/3812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/media\/3804"}],"wp:attachment":[{"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/media?parent=3803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/categories?post=3803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imastudio.com\/id\/wp-json\/wp\/v2\/tags?post=3803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}