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

Android共享存储读写JSON文件:startActivityForResult参数问题求助

解决startActivityForResult不存在的问题,实现共享存储JSON备份功能

startActivityForResult方法已被Android官方废弃,现在推荐使用Activity Result API来处理页面跳转后的结果回调,以下是适配后的完整实现方案:


1. 注册Activity Result Launcher

在你的Activity或Fragment中,先注册一个用于接收文件创建结果的Launcher:

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.provider.DocumentsContract
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.io.OutputStream

class BackupActivity : AppCompatActivity() {
    // 注册文件创建结果回调
    private val createFileLauncher: ActivityResultLauncher<Intent> =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                // 获取用户创建的文件Uri
                result.data?.data?.let { uri ->
                    writeJsonToFile(uri)
                }
            }
        }

2. 修改文件创建方法

替换原有的startActivityForResult调用,用Launcher启动文件选择Intent:

private fun createFile(pickerInitialUri: Uri) {
        val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "application/json"
            putExtra(Intent.EXTRA_TITLE, "backup.json")
            // 可选:指定文件选择器默认打开的目录
            putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
        }
        createFileLauncher.launch(intent)
    }

3. 实现JSON写入逻辑

通过ContentResolver将JSON数据写入到用户选择的文件中:

private fun writeJsonToFile(uri: Uri) {
        // 替换为你的实际备份JSON内容
        val backupJson = """
            {
                "backupTime": "${System.currentTimeMillis()}",
                "userData": {
                    "name": "test",
                    "settings": {"theme": "dark"}
                }
            }
        """.trimIndent()

        try {
            contentResolver.openOutputStream(uri)?.use { outputStream: OutputStream ->
                outputStream.write(backupJson.toByteArray())
                Toast.makeText(this, "备份成功", Toast.LENGTH_SHORT).show()
            }
        } catch (e: IOException) {
            e.printStackTrace()
            Toast.makeText(this, "备份失败", Toast.LENGTH_SHORT).show()
        }
    }

4. 后续读取备份文件

如果需要读取已创建的备份文件,可通过持久化存储的Uri(比如存在SharedPreferences中)来读取:

private fun readBackupJson(uri: Uri): String? {
        return try {
            contentResolver.openInputStream(uri)?.use { inputStream ->
                val reader = BufferedReader(InputStreamReader(inputStream))
                val content = StringBuilder()
                var line: String?
                while (reader.readLine().also { line = it } != null) {
                    content.append(line)
                }
                content.toString()
            }
        } catch (e: IOException) {
            e.printStackTrace()
            null
        }
    }
}

内容的提问来源于stack exchange,提问作者Isaak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:15:47