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

Android双Activity读写JSON文件无输出问题排查求助

问题排查与解决方案:Android OutputActivity无法读取JSON内容

嘿,我来帮你搞定这个问题!首先得戳破一个关键误区:Android的asset目录是只读的——你完全没办法在运行时往这个目录里写入或修改文件,这就是OutputActivity读不到内容的核心原因。

为什么写入asset目录行不通?

  • asset目录是APK打包时就嵌入的静态资源目录,安装到设备后,整个目录处于只读状态。你的MainActivity里尝试写入asset/file.json的操作根本不会生效,文件还是保持打包时的初始状态(大概率是空的),所以OutputActivity自然读不到你输入的账号密码。

解决方案:换个可读写的存储位置

既然asset不能写,我们可以改用应用内部存储(不需要权限,适合保存敏感信息),或者直接用Intent传递数据(更简单的临时传递方式),下面分别给出两种方案的代码示例:

方案1:用内部存储保存并读取JSON

MainActivity中写入数据的代码:
// 获取输入框内容后调用这个方法保存
private void saveToInternalStorage(String username, String password) {
    try {
        // 获取应用内部私有存储目录
        File storageDir = getFilesDir();
        File jsonFile = new File(storageDir, "user_credentials.json");
        
        // 构建JSON对象
        JSONObject credentials = new JSONObject();
        credentials.put("USERNAME", username);
        credentials.put("PASSWORD", password);
        
        // 写入文件
        FileWriter writer = new FileWriter(jsonFile);
        writer.write(credentials.toString());
        writer.flush();
        writer.close();
        
        // 跳转到OutputActivity
        Intent intent = new Intent(this, OutputActivity.class);
        startActivity(intent);
    } catch (IOException | JSONException e) {
        e.printStackTrace();
        // 可以在这里添加错误提示,比如Toast
    }
}
OutputActivity中读取数据的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_output);
    
    TextView tvUsername = findViewById(R.id.tv_username);
    TextView tvPassword = findViewById(R.id.tv_password);
    
    loadFromInternalStorage(tvUsername, tvPassword);
}

private void loadFromInternalStorage(TextView tvUsername, TextView tvPassword) {
    try {
        File storageDir = getFilesDir();
        File jsonFile = new File(storageDir, "user_credentials.json");
        
        // 如果文件不存在,直接返回
        if (!jsonFile.exists()) {
            tvUsername.setText("暂无保存的账号");
            tvPassword.setText("暂无保存的密码");
            return;
        }
        
        // 读取文件内容
        BufferedReader reader = new BufferedReader(new FileReader(jsonFile));
        StringBuilder content = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            content.append(line);
        }
        reader.close();
        
        // 解析JSON并设置到TextView
        JSONObject credentials = new JSONObject(content.toString());
        tvUsername.setText(credentials.getString("USERNAME"));
        tvPassword.setText(credentials.getString("PASSWORD"));
        
    } catch (IOException | JSONException e) {
        e.printStackTrace();
        tvUsername.setText("读取失败");
        tvPassword.setText("读取失败");
    }
}

方案2:用Intent直接传递数据(更简单)

如果只是从MainActivity跳转到OutputActivity时传递数据,完全不需要写文件,直接用Intent携带数据即可:

MainActivity中跳转并传递数据:
// 获取输入框内容
String username = editTextUsername.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();

// 构建Intent并传递数据
Intent intent = new Intent(MainActivity.this, OutputActivity.class);
intent.putExtra("KEY_USERNAME", username);
intent.putExtra("KEY_PASSWORD", password);
startActivity(intent);
OutputActivity中接收数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_output);
    
    TextView tvUsername = findViewById(R.id.tv_username);
    TextView tvPassword = findViewById(R.id.tv_password);
    
    // 从Intent中获取数据
    String username = getIntent().getStringExtra("KEY_USERNAME");
    String password = getIntent().getStringExtra("KEY_PASSWORD");
    
    // 设置到TextView
    tvUsername.setText(username != null ? username : "无账号");
    tvPassword.setText(password != null ? password : "无密码");
}

额外注意事项

  • 内部存储的文件只有你的应用能访问,卸载应用时会被删除,适合保存敏感信息;
  • 如果一定要用外部存储,需要在AndroidManifest.xml中声明权限,并且在Android 6.0及以上版本动态申请读写权限;
  • 如果你原本的asset目录下有初始的file.json,只能用来读取,不能修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 03:42:38