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
相关产品推荐
相关产品推荐

