为什么fileOutputStream在这里抛出异常?

问题描述 投票:0回答:2
var result = ""
    withContext(Dispatchers.IO) {
        if (bitmap != null) {
            try {
                val bytes = ByteArrayOutputStream()
                bitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes)

                val dir = File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "ArtAdda")
                dir.mkdirs()
                val f = File(dir , "${System.currentTimeMillis() / 1000}" + ".png")
                val fo = FileOutputStream(f)
                fo.write(bytes.toByteArray())
                fo.flush()
                fo.close()
                result = f.absolutePath

                runOnUiThread {
                    if (result.isNotEmpty()) {
                        Toast.makeText(this@MainActivity, "File saved successfully: $result", Toast.LENGTH_LONG).show()
                    }
                }
            } catch (e: Exception) {
                result = ""
                e.printStackTrace()
            }
        }
    }

任何人都可以告诉我为什么我的代码不起作用,在这里我试图将应用程序中存在的图像保存在手机的 dcim 文件夹中

android android-studio kotlin exception fileoutputstream
2个回答
0
投票

您可能无权在该目录中写入内容。或者您可能没有添加必要的权限来清单。可能是这个,但不确定;

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

尝试调试它以查看详细错误。

请在 catch 中使用更多相关的异常类,而不是 Exception 基类。您还可以使用多个捕获。尝试首先列出最专业的异常的捕获,否则 (e: Exception) 将捕获所有异常。

catch (e : ExceptionClass1) {
 some code
}
catch (e: ExceptionClass2) {  //less specialised than ExceptionClass1
 some code
}
catch (e: Exception) {  //least specialised
 some code
}

0
投票

考虑使用Kotlin的use函数来自动关闭FileOutputStream。 和 确保您拥有写入外部存储所需的权限,特别是对于强制执行范围存储的 Android 10(API 级别 29)及更高版本。 加 确保 FileOutputStream 在 finally 块中关闭,以防止资源泄漏。 来源:-chatgpt

© www.soinside.com 2019 - 2024. All rights reserved.