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
相关产品推荐
相关产品推荐

