Android APIv29 FileNotFoundException EACCES (Permission denied)

微笑、不失礼 提交于 2019-12-06 06:33:13

问题


I'm not able to access storage when building for targetSdkVersion v29.

Here is my gradle configuration:

    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    ...
        minSdkVersion 15
        targetSdkVersion 29

NOTE that WRITE_EXTERNAL_STORAGE permission is granted and the same setup works fine when building for targetSdkVersion 28.

Here is my implementation:

        val outputFolder = File(baseFolder + File.separator + "Output Folder")
        if (!outputFolder.exists()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Files.createDirectory(outputFolder.toPath()) //This allways returns false with targetSdkVersion 29
            } else {
                if (!outputFolder.mkdirs()) {
                    Log.e("SaveRaw", "Unable to create folder for audio recording")
                }
            }
        }

        outputFile = File("$baseFolder/Output Folder/$filename")
        try {
            fileOutputStream = FileOutputStream(outputFile)
        } catch (e: FileNotFoundException) {
            e.printStackTrace() // allways throwing exception here, even if Output Folder exists 
        }

and here is the exception:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:496)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:186)

Hope anyone has an answer, what am I missing here?

Update:

Here is where baseFolder comes from. Note that getExternalStorageDirectory is a deprecated method.

        val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Environment.getExternalStorageDirectory().absolutePath
        } else {
            context.filesDir.absolutePath
        }

Thanks


回答1:


Starting with Android 11 the storage permission is getting revoked and developers would need to consider alternative ways of accessing the storage they need either through SAF or Media Store. For the time being, you can carry on using what you’re using by adding the following in your manifest within the application tags:

android:requestLegacyExternalStorage="true"

You might want to consider changing your minSDK to 19 and use getExternalFilesDir() to get a path that doesn’t require any permissions.




回答2:


may be this can help you there are changes in android level 29 https://developer.android.com/about/versions/10/behavior-changes-10




回答3:


When your app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible to apps.

    val path = getExternalFilesDir(Environment.DIRECTORY_PICTURES.toString() + 
    File.separator + "Output Folder")
    val file = File(getExternalFilesDir(null), "filename.jpg")

For more details visit Docs




回答4:


you need request permission Manifest.permission.WRITE_EXTERNAL_STORAGE again.

before 9.0,you request only Manifest.permission.READ_EXTERNAL_STORAGE and you will get also Manifest.permission.WRITE_EXTERNAL_STORAGE,but begin with 9.0,you can get only one permission that you have requseted.

Forgive my poor english.



来源:https://stackoverflow.com/questions/58430070/android-apiv29-filenotfoundexception-eacces-permission-denied

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!