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

Android Studio中使用Kotlin生成PDF出现EROFS只读文件系统错误

报错原因
  • 核心错误是路径传参错误:你虽然拼接了指向Download目录的mFilePath变量,但实际传给FileOutputStream的参数是只有文件名的mFileName,系统会默认尝试在只读的系统根分区创建文件,直接触发EROFS只读文件系统报错。
  • 路径构造逻辑错误:Environment.DIRECTORY_DOWNLOADS是目录常量字符串,直接拼接无法得到外部存储的真实可写路径,需要调用系统API获取公共存储目录的完整路径。
  • 附加逻辑错误:你获取EditText输入内容的写法是chno1.toString(),拿到的是EditText控件对象的序列化字符串,而非用户输入的文本内容。
修复方案

1. 权限配置(AndroidManifest.xml)

根据适配的系统版本添加对应权限:

<!-- Android 9及以下需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

2. 修正savePDF函数逻辑

适配Android分区存储规则,修改后的代码如下:

private fun savePDF() {
    val mDoc = Document()
    val mFileName = SimpleDateFormat("yyyyMMdd", Locale.getDefault()).format(System.currentTimeMillis()) + ".pdf"
    val contentResolver = contentResolver

    try {
        // 适配不同Android版本的存储规则
        val outputStream: OutputStream? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android10及以上使用MediaStore写入公共Download目录
            val contentValues = ContentValues().apply {
                put(MediaStore.MediaColumns.DISPLAY_NAME, mFileName)
                put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
                put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
            }
            contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)?.let { uri ->
                contentResolver.openOutputStream(uri)
            }
        } else {
            // Android9及以下使用传统路径写入
            val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
            val targetFile = File(downloadDir, mFileName)
            FileOutputStream(targetFile)
        }

        outputStream?.let {
            PdfWriter.getInstance(mDoc, it)
            mDoc.open()
            val chno1 = findViewById<EditText>(R.id.chno1)
            // 修正获取输入文本的逻辑
            val data = chno1.text.toString().trim()
            mDoc.addAuthor("XYZ")
            mDoc.add(Paragraph(data))
            mDoc.close()
            it.close()
            Toast.makeText(this, "$mFileName \n已保存到Download目录", Toast.LENGTH_SHORT).show()
        } ?: run {
            Toast.makeText(this, "文件创建失败", Toast.LENGTH_SHORT).show()
        }
    } catch (e: Exception) {
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:15:03