Внутренняя память Android не сохраняет файл
У меня есть основной вид деятельности, и при нажатии на элемент списка, он запускает новый вид деятельности по намерению. Тема этого нового действия - Диалог (так что, похоже, второе действие находится над основным действием).
В этом новом задании я ввожу некоторые данные в EditTexts, затем с этими данными я создаю пользовательский объект и пытаюсь сохранить его во внутреннем хранилище.
кажется, что это не создает файл. Я не могу понять, почему это не работает, так как я использую ту же структуру с другими объектами в других действиях, и она работает правильно. Это то, что заставляет меня думать, что это должно быть как-то связано с тем, что тема этого занятия - Диалог. Класс пользовательских объектов, очевидно, реализует Serializable, и у меня есть все разрешения в моем манифесте Android. Возможно, проблема связана с контекстом, который я передаю методу сохранения (getApplicationContext()
).
Это упражнение с темой диалога:
package es.lagoacunado.lagoacunadoconsutores;
import java.io.File;
import utilidades.SeriaPreferencias;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import clases.Preferencia;
public class Preferencias extends Activity {
EditText ftpDir, ftpUser, ftpPass;
Button btnGuardar, btnCancelar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferencias);
this.setFinishOnTouchOutside(false);
ftpDir = (EditText) findViewById(R.id.ftpDIR);
ftpUser = (EditText) findViewById(R.id.ftpUSER);
ftpPass = (EditText) findViewById(R.id.ftpPASS);
btnGuardar = (Button) findViewById(R.id.btnGuardar);
btnCancelar = (Button) findViewById(R.id.btnCancelar);
File filePref = new File("preferencias.dat");
if (filePref.exists()) {
/*
* ftpDir.setText(SeriaPreferencias.cargarPreferencias(
* getApplicationContext()).getDirFTP());
* ftpUser.setText(SeriaPreferencias.cargarPreferencias(
* getApplicationContext()).getUsrFTP());
* ftpPass.setText(SeriaPreferencias.cargarPreferencias(
* getApplicationContext()).getPssFTP());
*/
Preferencia loadPref = SeriaPreferencias
.cargarPreferencias(getApplicationContext());
ftpDir.setText(loadPref.getDirFTP());
ftpUser.setText(loadPref.getUsrFTP());
ftpPass.setText(loadPref.getPssFTP());
}
btnGuardar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String dir, usr, pss;
dir = ftpDir.getText().toString();
usr = ftpUser.getText().toString();
pss = ftpPass.getText().toString();
//Log.d("PRUEBA Guardar Preferencias", "dir= "+dir+" -- user= "+usr+" -- pss= "+pss);
Preferencia pref = new Preferencia(dir, usr, pss);
// METHOD THAT SAVES THE OBJECT pref
SeriaPreferencias.guardarPreferencias(getApplicationContext(),
pref);
File prueba = new File("preferencias.dat");
if(prueba.exists()){
Log.d("-->PRUEBA", "EL ARCHIVO EXISTE");
}
finish();
}
});
btnCancelar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
Это класс с методами сохранения и загрузки:
package utilidades;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.content.Context;
import android.util.Log;
import clases.Preferencia;
public class SeriaPreferencias {
private static String FICHERO = "preferencias.dat";
public static void guardarPreferencias(Context context, Preferencia prefs) {
try {
FileOutputStream fos = context.openFileOutput(FICHERO,
Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(prefs);
oos.close();
fos.close();
} catch (Exception e) {
Log.e("MiCV", e.getMessage(), e);
}
}
public static Preferencia cargarPreferencias(Context context) {
Preferencia prefs = null;
try {
FileInputStream fis = context.openFileInput(FICHERO);
ObjectInputStream ois = new ObjectInputStream(fis);
prefs = (Preferencia) ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
Log.e("MiCV", e.getMessage(), e);
}
return prefs;
}
}
и это класс пользовательских объектов:
package clases;
import java.io.Serializable;
public class Preferencia implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String dirFTP, usrFTP, pssFTP;
public Preferencia() {
}
public Preferencia(String dirFTP, String usrFTP, String pssFTP) {
this.dirFTP = dirFTP;
this.usrFTP = usrFTP;
this.pssFTP = pssFTP;
}
public String getDirFTP() {
return dirFTP;
}
public void setDirFTP(String dirFTP) {
this.dirFTP = dirFTP;
}
public String getUsrFTP() {
return usrFTP;
}
public void setUsrFTP(String usrFTP) {
this.usrFTP = usrFTP;
}
public String getPssFTP() {
return pssFTP;
}
public void setPssFTP(String pssFTP) {
this.pssFTP = pssFTP;
}
}
1 ответ
File filePref = new File("preferencias.dat");
Указание только имени файла и отсутствие каталога будет ссылаться на файл в текущем рабочем каталоге, но вполне вероятно, что это корневой каталог файловой системы, который является не только неподходящим местом, но и недоступным для записи вашим приложением.
Когда вы используете Context.openFileOuput (имя файла), чтобы открыть или создать FileOutputStream, имя файла относится к расположению в личном каталоге вашего приложения внутреннего хранилища.
Чтобы создать файл Object, указывающий на этот же файл в частной области хранения вашего приложения, из класса Activity или другого допустимого контекста, во время или после его метода onCreate(), вы можете использовать:
File filePref = new File(getFilesDir(), "preferencias.dat");
Потому что Context.getFilesDir() ссылается на то же местоположение личной папки, что и Context.openFileOutput().