我想将二进制数据保存到我的Android应用程序中的一个文件中,并在以后加载该文件.用户应该可以访问文件-他们应该能够将其传输到另一台设备并在那里加载(假设是导出/导入数据).

然而,多年来,与存储交互的方式似乎有很多种,我真的很难理解如何最好地完成这项简单的任务.我正在使用Jetpack Compose.

我在另一个问题中找到了以下代码.这使我能够创建一个(空白)文件.然而,我不确定我应该如何写它,以及我以后应该如何阅读它.


    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        pickedUri = it.data?.data
    }

    Button(
        onClick = {
            val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
                .apply {
                    addCategory(Intent.CATEGORY_OPENABLE)
                    type = "application/octet-stream"
                    putExtra(Intent.EXTRA_TITLE, "export.dat")
                }
            launcher.launch(intent)
        }
    ) {
        Text("Select")
    }

推荐答案

您可以将Uri传递给您的视图模型.在协程中,您的视图模型可以使用ContentResolveropenOutputStream()在由Uri标识的位置上获得OutputStream.然后,在刷新和关闭OutputStream之前,视图模型可以写入OutputStream.同时,视图模型可以发出反映当前状态(例如,正在写入、写入已完成)的视图状态.合成器可以观察该视图状态以更新进度微调器或在UI中反映写入操作状态的任何内容.

这其中的大部分与编写用户界面没有什么关系.您可以在下面的链接中阅读有关ContentResolver部分的更多信息:

this blog post演示了如何在可组合的中直接完成这项工作.我并不建议这样做,我definitely也不建议在主应用程序线程上编写内容(而不是在非Main Dispatcher上启动的协程程序中).

Android相关问答推荐

在Android中点击滑动时触发的手势

在Android Studio Iguana 2023.2.1中,哪里可以找到能量分析器?

在Android Studio中陷入了不兼容的Gradle版本的循环

房间DB:UPSERT返回什么?

懒惰的垂直网格中盒子的重量-Jetpack组合

Android:微调:在代码中设置ArrayAdapter不希望调用On ItemSelected,仅当用户单击微调时调用

在以XML格式设置完整屏幕视图时可见App Compat按钮

如何使可拖动内容停留在可组合框的边界内

Android Kotlin ImageView内置于Kotlin ImageView中.适配器未按预期更新

如何在Android中打印到命令行

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

布局可组合项如何具有可测量和约束参数?

Android Jetpack Compose全宽度抽屉优化

浏览器未命中断点判断 USB 连接设备

从 Jetpack Compose 中的 IconButton 中删除黑色色调

如何用jetpack compose实现垂直李克特量表

如何在jetpack compose中通过lamda返回columnScope/RowScope

在 Jetpack Compose 中更改列中子项的对齐方式

在compose中,为什么修改List元素的属性,LazyColumn不刷新

可组合的可见性不随状态变化而变化