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

