You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin API30已授权存储仍报EACCES(Permission denied)错误

问题根因

你遇到的是Android 11(API 30)分区存储的特有限制:即便你开启了android:requestLegacyExternalStorage="true",应用也没有权限修改/覆盖公共存储目录(比如Download)下其他应用创建的文件。你反馈只有PDF格式报错,大概率是Download目录下已经存在同名的PDF文件,该文件由其他应用生成,你的应用没有覆盖写入权限,其他格式文件不存在同名冲突所以可以正常写入。

验证方案

你可以先手动删除目标实体机Download目录下的SKE_Labor.pdf文件,再重新触发下载,此时应该可以正常保存,即可确认是同名文件冲突导致的权限错误。

永久解决方案

方案1:快速兼容适配

写入前先判断目标文件是否存在,存在则给文件名加随机后缀避免冲突:

val baseFileName = file.getFilename()!!
var myFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), baseFileName)
// 存在同名文件则加时间戳后缀
if (myFile.exists()) {
    val nameWithoutExt = baseFileName.substringBeforeLast(".")
    val ext = baseFileName.substringAfterLast(".", "")
    val newFileName = "${nameWithoutExt}_${System.currentTimeMillis()}.$ext"
    myFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), newFileName)
}

方案2:合规适配分区存储(推荐)

放弃直接使用File API写入公共目录,改用MediaStore API适配Android 11+的存储规范,无需申请存储权限即可写入公共Download目录:

val resolver = mContext.contentResolver
val contentValues = ContentValues().apply {
    put(MediaStore.Downloads.DISPLAY_NAME, file.getFilename()!!)
    put(MediaStore.Downloads.MIME_TYPE, "application/pdf")
    put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues) ?: return
// 写入文件流
resolver.openOutputStream(uri)?.use { outputStream ->
    // 此处替换为Firebase Storage的流写入逻辑
    fileRef.getStream().addOnSuccessListener { taskSnapshot ->
        taskSnapshot.stream.use { inputStream ->
            inputStream.copyTo(outputStream)
            Toast.makeText(mContext,"文件已下载到Download目录",Toast.LENGTH_LONG).show()
        }
    }.addOnFailureListener {
        Toast.makeText(mContext,it.toString(),Toast.LENGTH_LONG).show()
    }
}

内容的提问来源于stack exchange,提问作者NHuhs1887

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:06