Android APIv29 FileNotFoundException EACCES(权限被拒绝)

标签 android kotlin filenotfoundexception android-external-storage android-api-levels

为 targetSdkVersion v29 构建时,我无法访问存储。

这是我的gradle配置:

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

请注意 WRITE_EXTERNAL_STORAGE在为 targetSdkVersion 28 构建时,已授予权限并且相同的设置工作正常.

这是我的实现:
        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 
        }

这是一个异常(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)

希望有人有答案,我在这里错过了什么?

更新:

这里是baseFolder来自。请注意 getExternalStorageDirectory是一种已弃用的方法。
        val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Environment.getExternalStorageDirectory().absolutePath
        } else {
            context.filesDir.absolutePath
        }

谢谢

最佳答案

Starting with Android 11存储权限将被撤销,开发人员需要考虑通过 SAF 访问所需存储的替代方法或 Media Store .目前,您可以通过在应用程序标签内的 list 中添加以下内容来继续使用您正在使用的内容:

android:requestLegacyExternalStorage="true"

您可能需要考虑将 minSDK 更改为 19 并使用 getExternalFilesDir()获得不需要任何权限的路径。

关于Android APIv29 FileNotFoundException EACCES(权限被拒绝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58430070/

相关文章:

android 如何在点击通知时打开上一个 Activity

android - java.io.FileNotFoundException :/sdcard/DCIM/ROBIN. jpg(没有这样的文件或目录)

kotlin - 在Vert.x最佳实践中处理数百条路线

java - FileNotFoundException 仅在 Android 应用程序中

Java 说 FileNotFoundException 但文件存在

javascript - sleep 时移动设备上的 window.speechSynthesis

android - 带通知的 AsyncTask

java - 启动画面不出现,主要 Activity 出现

android - 仅允许使用 -Xjvm-default 选项从具有 '@JvmDefault' 成员的接口(interface)继承

android - 解析复杂的JSON对象