Di Lollipop, fungsi unduhan berfungsi dengan baik di aplikasi saya, tetapi ketika saya memutakhirkan ke Marshmallow, aplikasi saya macet dan memberikan kesalahan ini ketika saya mencoba mengunduh dari internet ke kartu SD:
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
Mengeluh tentang baris kode ini:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Saya memiliki izin dalam aplikasi luar manifes:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Saya membersihkan dan membangun kembali proyek, tetapi masih macet.
Jawaban:
Anda harus memeriksa apakah pengguna telah memberikan izin penyimpanan eksternal dengan menggunakan:
Jika tidak, Anda harus meminta pengguna untuk memberi izin aplikasi Anda:
Tentu saja ini hanya untuk perangkat marshmallow sehingga Anda perlu memeriksa apakah aplikasi Anda berjalan di Marshmallow:
Pastikan juga aktivitas Anda diimplementasikan
OnRequestPermissionResult
Seluruh izin terlihat seperti ini:
Panggilan balik hasil izin:
sumber
Manifest.permission.WRITE_EXTERNAL_STORAGE
selalu mengembalikan '-1' yaitu Izin ditolak. Periksa dokumentasi baru, dikatakan bahwa untuk API 19 dan seterusnya, Anda tidak perluWRITE_EXTERNAL_STORAGE
izin. Seperti yang disebutkan beberapa komentar di atas, Anda harus melakukan semua ini denganManifest.permission.READ_EXTERNAL_STORAGE
getExternalFilesDir()
. Dalam kasus lain, izin masihandroid.permission.WRITE_EXTERNAL_STORAGE
harus dinyatakan dalam manfiest.Courtesy pergi ke Permohonan Izin pada Run Time .
Contoh
Nyatakan ini sebagai Global
Tambahkan ini di
onCreate()
bagian AndaSetelah setContentView (R.layout.your_xml);
Sekarang menambahkan checkPermission () dan requestPermission ()
FYI
padaRequestPermissionsResult
sumber
Periksa beberapa Izin di API level 23 Langkah 1:
Langkah 2:
Langkah 3:
Langkah 4: di onCreate of Activity checkPermissions ();
sumber
never ask again
dan melewatkan beberapa izin? Apakah pengguna mendapat umpan balik? Pasti menyenangkan melihat contoh nyata dari ini atau lebih banyak komentar pada cuplikan kode Anda.Kecuali jika ada persyaratan tertentu untuk menulis di penyimpanan eksternal, Anda selalu dapat memilih untuk menyimpan file di direktori aplikasi. Dalam kasus saya, saya harus menyimpan file dan setelah membuang 2 sampai 3 hari saya mengetahui apakah saya mengubah jalur penyimpanan
untuk
ini bekerja seperti pesona di semua perangkat. Ini karena untuk menulis di penyimpanan eksternal Anda memerlukan izin tambahan tetapi menulis di direktori aplikasi internal sederhana.
sumber
Anda perlu menggunakan izin runtime di marshmallow https://developer.android.com/training/permissions/requesting.html
Anda dapat memeriksa info aplikasi -> izin
apakah aplikasi Anda mendapatkan izin untuk menulis penyimpanan eksternal atau tidak
sumber
Tampaknya pengguna telah menolak izin dan aplikasi mencoba menulis ke disk eksternal, menyebabkan kesalahan.
Periksa https://developer.android.com/training/permissions/requesting.html
Video ini akan memberi Anda ide yang lebih baik tentang UX, menangani izin Runtime https://www.youtube.com/watch?v=iZqDdvhTZj0
sumber
Dari versi marshmallow, pengembang perlu meminta izin runtime kepada pengguna. Biarkan saya memberi Anda seluruh proses untuk meminta izin runtime.
Saya menggunakan referensi dari sini: izin runtime marshmallow android .
Pertama buat metode yang memeriksa apakah semua izin diberikan atau tidak
Sekarang di sini adalah kode yang dijalankan setelah metode di atas. Kami akan mengganti
onRequestPermissionsResult()
metode:Jika pengguna mengklik opsi Tolak maka
showDialogOK()
metode akan digunakan untuk menampilkan dialogJika pengguna mengklik Tolak dan juga mengklik kotak centang yang mengatakan "tidak pernah bertanya lagi" , maka
explain()
metode akan digunakan untuk menampilkan dialog.metode untuk menampilkan dialog:
Cuplikan kode di atas meminta empat izin sekaligus. Anda juga dapat meminta sejumlah izin dalam aktivitas apa pun sesuai kebutuhan Anda.
sumber
Setelah banyak mencari, kode ini berfungsi untuk saya:
Periksa izin yang sudah ada: Periksa izin WRITE_EXTERNAL_STORAGE Diizinkan atau tidak?
Menerapkan metode Override onRequestPermissionsResult untuk memeriksa apakah pengguna mengizinkan atau menolak
sumber
ini bekerja untuk saya
sumber
sumber
Sebelum memulai unduhan, periksa izin runtime Anda dan jika Anda tidak memiliki izin, minta izin seperti metode ini
requestStoragePermission ()
sumber
Secara sederhana izin dapat diberikan menggunakan file manifest.xml, tetapi itu ok sampai tingkat api 23 sdk versi 6, setelah dari sini, jika kita ingin mendapatkan izin kita harus meminta penggunaannya untuk mengizinkan izin yang dibutuhkan.
Cukup tambahkan kode ini di mainActivity.java
Ganti CAMERA atau tambahkan dengan WRITE_EXTERNAL_STORAGE jika Anda mau, dan dengan kode unik.
Ini adalah kode sederhana untuk mendapatkan izin.
sumber