【发布时间】:2020-02-14 05:22:45
【问题描述】:
在为 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
}
这里是个例外:
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
}
谢谢
【问题讨论】:
-
尝试使用这个库获得权限github.com/googlesamples/easypermissions
-
正如我已经提到的,写入外部存储所需的权限被授予,并且在使用
targetSdkVersion 28构建时,相同的设置工作。这不是权限问题! -
其权限相邻,根据错误无法获得权限访问文件/storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (权限被拒绝),如果 android 10 使用范围存储
-
那么你如何解释它在为
targetSdkVersion 28构建时有效?根据错误,是的,这是与权限相关的问题,但不是因为未授予权限。 -
您没有文件系统访问外部和可移动存储上任意位置的权限。 removable storage 限制是在 Android 4.4 中添加的。 external storage limitation 是在 Android 10 中添加的。
标签: android kotlin filenotfoundexception android-external-storage android-api-levels