Following error in Android application is very annoying and you may waste several hours by hunting the root cause:
D/file: java.io.FileNotFoundException: /storage/emulated/0/Download/20190604_084533.jpg:
open failed: EACCES (Permission denied)
It might occur even when the manifest is correct and contains proper permission:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Here is sample code which will pass on file existence check, but the execution will fail on readBytes:
var file:File = File("/storage/emulated/0/Download/20190604_084533.jpg")
if (file.exists()) {
val content:ByteArray;
Log.d("file", "exist")
try {
content = f.readBytes()
} catch (FileNotFoundException) {
Log.d("file", e.toString())
}
} else {
Log.d("file", "does not exist")
}
To fix this problem it is necessary to go to Settings – Apps – My App – Permission.
Access to Storage is probably disabled. Tap Storage to enable it:
With enabled Storage option, the application was able to read the file.
To solve this problem in a proper way, it’s necessary to add a request for permission to the code. Here is a sample in Kotlin:
val MY_READ_EXTERNAL_REQUEST : Int = 1
if (checkSelfPermission(
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), MY_READ_EXTERNAL_REQUEST)
}
You can find more details about requesting permissions in Android documentation.