Android 中是否可以将图像和文本保存到同一个文件中?

问题描述 投票:0回答:1

我目前正在使用 Kotlin 开发 Android 联系人应用程序,其中每个联系人的详细信息都保存到单个文件中。

我创建了一个数据类,用于保存每个联系人的数据(姓名、号码、电子邮件等),然后将数据类序列化为文件可接受的格式,然后使用 file.writeText(data) 将其保存到文件中.

一切都工作得很好,直到需要保存用户选择的联系人照片。尝试将图像保存到包含文本的文件时,应用程序崩溃。通过将图像转换为位图并使用 FileOutputStream,我能够成功地将图像保存到单独的文件中。然而,将所有数据存储在一起至关重要。

Android 有没有办法将图像和文本保存到文件中?如果没有,至少有一种方法可以将相关但独立的文件配对在一起吗?

感谢您花时间阅读我的问题。

android image kotlin file serialization
1个回答
0
投票

针对您的场景的常见解决方案是使用支持结构化数据的二进制文件格式(例如 Protocol Buffers),或者使用 Kotlin 创建结构。 这是分步信息:

1。对图像使用 Base64 编码: 针对您的场景的常见解决方案是使用支持结构化数据的二进制文件格式(例如 Protocol Buffers),或者使用 Kotlin 创建结构。

fun bitmapToBase64(bitmap: Bitmap): String {
    val byteArrayOutputStream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
    val byteArray = byteArrayOutputStream.toByteArray()
    return Base64.encodeToString(byteArray, Base64.DEFAULT)
}

fun base64ToBitmap(base64String: String): Bitmap {
    val byteArray = Base64.decode(base64String, Base64.DEFAULT)
    return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
}

序列化 Base64 字符串和其他联系方式并使用

file.writeText()
保存。

2。使用 ByteArray 序列化: 将联系人数据保存为结构化二进制内容。您可以使用 Kotlin 的可序列化接口或库,例如 Kotlinx Serialization

示例:

@Serializable
data class Contact(
    val name: String,
    val number: String,
    val email: String,
    val photo: ByteArray // Save the image as a byte array
)

保存数据:

val json = Json.encodeToString(contact)
file.writeText(json)

要在文件中包含二进制数据(例如图像):

val fileOutputStream = FileOutputStream(file)
val objectOutputStream = ObjectOutputStream(fileOutputStream)
objectOutputStream.writeObject(contact)
objectOutputStream.close()

3.配对相关文件: 如果将所有内容保存在一起不可行,您可以维护一个目录结构,其中每个联系人都有其包含元数据文本文件和图像文件的文件夹。

示例:

/contacts
    /contact1
        metadata.txt
        photo.png
    /contact2
        metadata.txt
        photo.png

您可以使用每个文件夹中文本和图像文件的一致文件名保存和检索数据。

概述: 将所有内容保存在单个文件中的最直接方法是使用

ByteArray
序列化和 Kotlinx 序列化或 Base64 编码。然而,配对相关文件更简单,并且避免了处理文本文件中大型 Base64 编码图像的复杂性。

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