Идея заключается в следующем. когда я запускаю приложение, оно переходит к методу загрузки данных. Поиск файла, если есть загрузка из него, если вы не загружаете массив с данными, которые я дал ему. Когда вы нажимаете кнопку для сохранения на SD, вы создаете файл в папке приложения на SD. Я оставляю свой код Метод написания не дает ошибки, но я не знаю, все ли в порядке. при загрузке данных я получаю эту ошибку
public class MainActivity extends AppCompatActivity implements Serializable {
private ArrayList<Cuadros> datos = new ArrayList();
private ListView listCuadros;
private AdaptadorCuadros adaptador;
private Context contexto;
private int i = 0;
private int REQUEST_WRITE_EXTERNAL_STORAGE = 0;
File memExt = Environment.getExternalStorageDirectory();
File fichero = new File(memExt.getAbsolutePath(), "fichero.dat");
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabs = findViewById(R.id.tabhost);
tabs.setup();
TabHost.TabSpec spec = tabs.newTabSpec("mitab1");
spec.setContent(R.id.tab1);
spec.setIndicator("Lista del museo");
tabs.addTab(spec);
spec = tabs.newTabSpec("mitab2");
spec.setContent(R.id.tab2);
spec.setIndicator("Editar/Añadir");
tabs.addTab(spec);
tabs.setCurrentTab(0);
contexto = this;
cargarDatos();
this.adaptador = new AdaptadorCuadros(this, this.datos);
titulo = findViewById((R.id.titulo));
autor = findViewById((R.id.autor));
estilo = findViewById(R.id.estilo);
precio = findViewById(R.id.precio);
fecha = findViewById(R.id.fecha);
guardar = findViewById(R.id.guardar);
this.guardar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
guardarEdit();
}
});
guardarSD = findViewById((R.id.guardarSD));
this.guardarSD.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
guardarEnSD();
}
});
this.listCuadros = findViewById(R.id.listView1);
listCuadros.setAdapter(adaptador);
registerForContextMenu(listCuadros);
listCuadros.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
i = position;
return false;
}
});
}
private void guardarEnSD() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "Se necesita acceso de escritura a la SD",
Toast.LENGTH_SHORT).show();
}
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
escribirSD(datos);
}
} else {
Toast.makeText(this, "La memoria externa no está disponible",
Toast.LENGTH_SHORT).show();
}
}
private void escribirSD(ArrayList<Cuadros> datos) {
try {
ObjectOutputStream ficheroSalida = new ObjectOutputStream(new FileOutputStream(fichero));
ficheroSalida.writeObject(datos);
ficheroSalida.flush();
ficheroSalida.close();
Toast.makeText(this, "Los datos fueron grabados correctamente en la SD",
Toast.LENGTH_SHORT).show();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
private void cargarDatos() {
if (fichero.exists()) {
try {
ObjectInputStream ficheroEntrada = new ObjectOutputStream(new FileInputStream(fichero));
datos = (ArrayList<Cuadros>) ficheroEntrada.readObject();
ficheroEntrada.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} else {
datos.add(new Cuadros("La Mona Lisa", "Leonardo da Vinci", "Renacentista", 713000000, Year.of(1503)));
datos.add(new Cuadros("El grito", "Munch", "Expresionismo", 119900000, Year.of(1893)));
datos.add(new Cuadros("La persistencia de la memoria", "Dalí ", "Surrealismo", 400000000, Year.of(1931)));
datos.add(new Cuadros("El nacimiento de Venus", "Sandro Botticelli", "Gotico", 10000000, Year.of(1482)));
datos.add(new Cuadros("Guernica", "Pablo Picasso", "Cubismo", 300000000, Year.of(1937)));
datos.add(new Cuadros("Los jugadores de cartas", "Paul Cézanne", "Posimpresionismo", 191000000, Year.of(1890)));
}
}
}