用Kotlin开发保存用户输入到文本文件的Android App崩溃问题排查
问题分析与优化方案
崩溃原因
- 路径权限错误:直接使用
File("data.txt")会尝试写入设备根目录,Android系统禁止普通应用访问根目录,触发SecurityException导致崩溃。 - 未处理IO异常:文件写入属于IO操作,可能抛出
IOException,未捕获会直接导致应用崩溃。 - (若涉及外部公共存储)缺少运行时权限:如果要写入外部公共存储,Android 6.0+需要动态申请
WRITE_EXTERNAL_STORAGE权限,未申请会触发权限异常。
优化实现方式
场景1:使用应用私有存储(推荐,无需权限)
应用私有存储仅当前应用可访问,适合保存应用内部数据,无需申请权限:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { val product = productName.text.toString().trim() if (product.isEmpty()) { Toast.makeText(this, "请输入内容", Toast.LENGTH_SHORT).show() return@setOnClickListener } val filename = "data.txt" // 获取应用私有文件目录,路径为/data/data/包名/files/ val file = File(filesDir, filename) try { file.writeText(product) Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show() } catch (e: IOException) { e.printStackTrace() Toast.makeText(this, "保存失败:${e.message}", Toast.LENGTH_SHORT).show() } } } }
场景2:使用应用专属外部存储(无需权限,文件随应用卸载删除)
如果需要文件在应用卸载前可被其他应用访问(需授权),可使用应用专属外部存储目录,Android 10+无需权限:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { val product = productName.text.toString().trim() if (product.isEmpty()) { Toast.makeText(this, "请输入内容", Toast.LENGTH_SHORT).show() return@setOnClickListener } val filename = "data.txt" // 获取应用专属外部存储目录,路径为/storage/emulated/0/Android/data/包名/files/ val externalFileDir = getExternalFilesDir(null) ?: run { Toast.makeText(this, "外部存储不可用", Toast.LENGTH_SHORT).show() return@setOnClickListener } val file = File(externalFileDir, filename) try { file.writeText(product) Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show() } catch (e: IOException) { e.printStackTrace() Toast.makeText(this, "保存失败:${e.message}", Toast.LENGTH_SHORT).show() } } } }
额外优化点
- 增加输入内容校验:避免保存空文本。
- 捕获IO异常:友好提示用户保存结果,避免应用崩溃。
- 使用
trim()去除输入内容前后空格,提升数据有效性。
内容的提问来源于stack exchange,提问作者Pooya Sadeghi
相关产品推荐
相关产品推荐

