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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:20:30