Saya mendapatkan
gagal terbuka:
EACCES (Permission denied)
di telepon OutputStream myOutput = new FileOutputStream(outFileName);
Saya memeriksa root, dan saya mencoba android.permission.WRITE_EXTERNAL_STORAGE
.
Bagaimana saya bisa memperbaiki masalah ini?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Jawaban:
Saya memiliki masalah yang sama ... Itu
<uses-permission
di tempat yang salah. Ini benar:The
uses-permission
tag harus luarapplication
tag.sumber
<uses-permission>
tag muncul setelah<application>
tag"android:maxSdkVersion="18"
. Itu menghasilkan pengecualian iniUntuk API 23+ Anda perlu meminta izin baca / tulis meskipun sudah ada dalam manifes Anda.
AndroidManifest.xml
Untuk dokumentasi resmi tentang meminta izin untuk API 23+, periksa https://developer.android.com/training/permissions/requesting.html
sumber
Google memiliki fitur baru di Android Q : tampilan berfilter untuk penyimpanan eksternal. Perbaikan cepat untuk itu adalah dengan menambahkan kode ini di file AndroidManifest.xml:
Anda dapat membaca lebih lanjut tentang ini di sini: https://developer.android.com/training/data-storage/compatibility
sumber
android:requestLegacyExternalStorage="true"
ini tidak akan merusak ryt versi yang lebih rendah? @UrielFrankelSaya telah mengamati ini sekali ketika menjalankan aplikasi di dalam emulator. Dalam pengaturan emulator, Anda perlu menentukan ukuran penyimpanan eksternal ("Kartu SD") dengan benar. Secara default, bidang "penyimpanan eksternal" kosong, dan itu mungkin berarti tidak ada perangkat seperti itu dan EACCES dilemparkan bahkan jika izin diberikan dalam manifes.
sumber
Selain semua jawaban, pastikan Anda tidak menggunakan ponsel sebagai penyimpanan USB.
Saya mengalami masalah yang sama pada HTC Sensation pada mode penyimpanan USB yang diaktifkan. Saya masih dapat men-debug / menjalankan aplikasi, tetapi saya tidak dapat menyimpan ke penyimpanan eksternal.
sumber
Menambahkan android: requestLegacyExternalStorage = "true" ke Android Manifest Hal ini bekerja dengan Android 10 (Q) di SDK 29+
atau Setelah bermigrasi Android X .
sumber
Masalah saya adalah "TargetApi (23)" yang diperlukan jika minSdkVersion Anda di bawah 23.
Jadi, saya minta izin dengan cuplikan berikut
sumber
Solusi untuk Android Q :
sumber
Saya mengalami hal yang sama. Apa yang saya temukan adalah bahwa jika Anda pergi ke Pengaturan -> Manajer Aplikasi -> Aplikasi Anda -> Izin -> Aktifkan Penyimpanan , itu memecahkan masalah.
sumber
Ternyata, itu adalah kesalahan bodoh karena ponsel saya masih terhubung ke PC desktop dan tidak menyadarinya.
Jadi saya harus mematikan koneksi USB dan semuanya bekerja dengan baik.
sumber
Saya memiliki masalah yang sama pada Samsung Galaxy Note 3, menjalankan CM 12.1. Masalahnya bagi saya adalah bahwa saya punya
dan harus menggunakannya untuk mengambil dan menyimpan foto pengguna. Ketika saya mencoba memuat foto-foto yang sama di ImageLoader saya mendapat
(Permission denied)
kesalahan. Solusinya adalah menambahkan secara eksplisitkarena izin di atas hanya membatasi izin tulis hingga API versi 18, dan dengan itu izin baca.
sumber
Selain semua jawaban, jika klien menggunakan Android 6.0, Android menambahkan model izin baru untuk (Marshmallow).
Trik: Jika Anda menargetkan versi 22 atau lebih rendah, aplikasi Anda akan meminta semua izin pada waktu pemasangan seperti pada perangkat yang menjalankan OS di bawah Marshmallow. Jika Anda mencoba emulator maka dari Android 6.0 dan seterusnya Anda perlu secara eksplisit pergi pengaturan-> aplikasi-> YOURAPP -> izin dan ubah izin jika Anda telah memberikannya.
sumber
Anehnya setelah meletakkan garis miring "/" sebelum file baru saya masalah saya terpecahkan. Saya mengubah ini:
untuk ini:
sumber
Saya memiliki masalah yang sama dan tidak ada saran yang membantu. Tapi saya menemukan alasan yang menarik untuk itu, pada perangkat fisik, Galaxy Tab .
Ketika penyimpanan USB aktif, izin baca dan tulis penyimpanan eksternal tidak memiliki efek apa pun. Matikan penyimpanan USB, dan dengan izin yang benar, masalah Anda akan terpecahkan.
sumber
Saya harapkan semua yang ada di bawah ini
/data
menjadi "penyimpanan internal". Namun, Anda harus bisa menulis/sdcard
.sumber
Ubah properti izin di
/system/etc/permission/platform.xml
dan grup Anda perlu disebutkan seperti di bawah ini.
sumber
Saya memiliki kesalahan yang sama ketika mencoba untuk menulis gambar di folder DCIM / kamera pada Galaxy S5 (android 6.0.1) dan saya tahu bahwa hanya folder ini yang dibatasi. Saya hanya bisa menulis ke DCIM / folder apa pun tetapi tidak di kamera. Ini harus pembatasan / penyesuaian berdasarkan merek.
sumber
Ketika aplikasi Anda milik aplikasi sistem, itu tidak dapat mengakses kartu SD.
sumber
perlu diingat bahwa meskipun Anda mengatur semua izin yang benar dalam manifes: Satu-satunya tempat aplikasi pihak ketiga diizinkan untuk menulis pada kartu eksternal Anda adalah "direktori mereka sendiri" (yaitu / sdcard / Android / data /) mencoba menulis ke di tempat lain: Anda akan mendapatkan pengecualian: EACCES (Izin ditolak)
sumber
Mungkin jawabannya adalah ini:
pada API> = 23 perangkat, jika Anda menginstal aplikasi (aplikasi bukan aplikasi sistem), Anda harus memeriksa izin penyimpanan di "Pengaturan - aplikasi", ada daftar izin untuk setiap aplikasi, Anda harus memeriksanya! mencoba
sumber
Dalam kasus saya, saya menggunakan perpustakaan file picker yang mengembalikan path ke penyimpanan eksternal tetapi itu dimulai dari
/root/
. Dan bahkan dengan izin WRITE_EXTERNAL_STORAGE yang diberikan saat runtime saya masih mendapatkan kesalahan EACCES (Izin ditolak) .Jadi gunakan
Environment.getExternalStorageDirectory()
untuk mendapatkan jalur yang benar ke penyimpanan eksternal.Contoh:
Tidak bisa menulis:
/root/storage/emulated/0/newfile.txt
Dapat menulis:
/storage/emulated/0/newfile.txt
Output 1:
Output 2:
sumber
root
bagian dari jalur menyelesaikan masalah saya.Saat menggunakan metode usang ini dari Android 29 dan seterusnya Anda akan menerima kesalahan yang sama:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Resolusi di sini:
getExternalStoragePublicDirectory sudah tidak digunakan lagi di Android Q
sumber
Bagi siapa pun yang datang ke sini dari hasil pencarian dan menargetkan Android 10: Android 10 (API 29) mengubah beberapa izin yang terkait dengan penyimpanan.
Saya memperbaiki masalah ini ketika saya mengganti contoh sebelumnya
Environment.getExternalStorageDirectory()
(yang tidak digunakan lagi dengan API 29)context.getExternalFilesDir(null)
.Catat itu
context.getExternalFilesDir(type)
dapat mengembalikan nol jika lokasi penyimpanan tidak tersedia, jadi pastikan untuk memeriksa setiap kali Anda memeriksa apakah Anda memiliki izin eksternal.Baca lebih lanjut di sini .
sumber
Saya membuat folder di bawah / data / di init.rc saya (bercanda dengan aosp pada Nexus 7) dan memiliki masalah ini.
Ternyata memberi izin folder rw (666) tidak cukup dan harus rwx (777) maka semuanya bekerja!
sumber
Posting 6.0 penegakan izin penyimpanan dapat dilewati jika Anda memiliki perangkat yang di-rooting melalui perintah adb ini:
sumber
Tambahkan Izin dalam manifes.
sumber
android.permission.READ_INTERNAL_STORAGE
Saya memiliki masalah yang sama (API> = 23).
Solusinya https://stackoverflow.com/a/13569364/1729501 bekerja untuk saya, tetapi tidak praktis untuk memutuskan koneksi aplikasi untuk debugging.
solusi saya adalah menginstal driver perangkat adb yang tepat di Windows. Google USB driver tidak berfungsi untuk perangkat saya.
LANGKAH 1: Unduh driver adb untuk merek perangkat Anda.
LANGKAH 2: Buka manajer perangkat -> perangkat lain -> cari entri dengan kata "adb" -> pilih Perbarui driver -> berikan lokasi di langkah 1
sumber
setelah menambahkan izin memecahkan masalah saya
sumber
Tambahkan dependensi gradle
Tambahkan kode di bawah ini dalam aktivitas utama Anda.
sumber
Dalam kasus saya kesalahan muncul di telepon
karena saya tidak dapat membuat file baru pada kartu sd, jadi saya harus menggunakan pendekatan DocumentFile.
Untuk pertanyaan di atas masalah dapat diselesaikan dengan pendekatan ini,
Lihat utas ini juga, Bagaimana cara menggunakan API akses kartu SD baru yang disajikan untuk Android 5.0 (Lollipop)?
sumber