Como guardar arraylist en archivo de texto interno android java

Iniciado por victor96, 19 Noviembre 2018, 12:32 PM

0 Miembros y 1 Visitante están viendo este tema.

victor96

Estoy buscando como guardar mediante código un archivo de texto que contenga un arraylist, he intentado con este código, pero da error cuando intenta guardar dicho arraylist en el archivo

try
            {
                OutputStreamWriter fout=
                        new OutputStreamWriter(
                                openFileOutput("contactos.txt", Context.MODE_PRIVATE));

                fout.write(contactos);
                fout.close();
            }
            catch (Exception ex)
            {
                Log.e("Ficheros", "Error al escribir fichero a memoria interna");
            }

En este caso contactos es el arraylist que deseo guardar dentro del archivo contactos.txt

rub'n

#1
Hola usa Geshi, y prueba este código, depende como lo apliques quizas genere error, postea el log para ver la posible excepción  



openFileOutput escribe datos en el directorio interno, haciéndolo privado para tu aplicación la linea 7 lo mete en un Thread() o sea, asíncrono para que cuando sean muchos contactos tu UI no se bloque, bueno hay muchas formas para correr eso de manera asíncrona, siendo esta una de las mas guarras como dicen en Spain, porque no retorna ningún valor


Código (java) [Seleccionar]

   private void writeFileTo() {
       final List<ContactoDemo> contactos = new ArrayList<>();
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       new Thread(() -> {
           try (final BufferedOutputStream bR = new BufferedOutputStream(openFileOutput("contactos.txt", Context.MODE_PRIVATE))) {
               contactos.forEach(contacto -> {
                   try {
                       bR.write((contacto.toString() + "\n").getBytes());
                   } catch (Exception ex) {
                       ex.printStackTrace();
                   }
               });
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }).start();
   }


Código (java) [Seleccionar]

public class ContactoDemo {
       private String name;
       private int phone;
       private String email;

       public ContactoDemo(String name, int phone, String email) {
           this.name = name;
           this.phone = phone;
           this.email = email;
       }

       public String getName() {
           return name;
       }

       public void setName(String name) {
           this.name = name;
       }

       public int getPhone() {
           return phone;
       }

       public void setPhone(int phone) {
           this.phone = phone;
       }

       public String getEmail() {
           return email;
       }

       public void setEmail(String email) {
           this.email = email;
       }

       @Override
       public String toString() {
           return "ContactoDemo{" +
                   "name='" + name + '\'' +
                   ", phone=" + phone +
                   ", email='" + email + '\'' +
                   '}';
       }
   }



Aparentemente pareciera que no escribiste nada pero en realidad si debes agregar esto en tu AndroidManifest.xml fuera del tag <application></application>

Código (xml) [Seleccionar]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Si intentas leer el archivo contactos.txt debes añadir también

Código (xml) [Seleccionar]
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Código (java) [Seleccionar]

private String readFileFrom() {
       final StringBuilder sb = new StringBuilder();
       try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {

           bR.lines().forEach(texto -> sb.append(texto+"\n"));

       } catch (IOException ex) { ex.printStackTrace(); }
       return sb.toString();
}


Te debería imprimir su contenido, en realidad para tener acceso físico a ese archivo debes tener el smartphone rooteado, a menos que uses el Device File Explorer por ejemplo el de Android Studio, esto es solo en modo de developer


Si deseas escribir el fichero contactos.txt  en directorios públicos como Documents, Movies, DCIM etc , debes usar

Código (java) [Seleccionar]
Environment.getExternalStoragePublicDirectory()

primero creas el directorio en cuestión por ejemplo /Contactos porque? pues porque no existe, sino arrojaría

Código (bash) [Seleccionar]
java.nio.file.NoSuchFileException: /storage/emulated/0/Contactos/contactos.txt

Código (java) [Seleccionar]

final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
   if (!Files.exists(dir)) {
       try {
           Files.createDirectory(dir);
       } catch (IOException e) {
           e.printStackTrace();
       }
    }


Una vez que ya tenemos el directorio creado podemos indicar donde queremos que se cree nuestro contactos.txt

Código (java) [Seleccionar]
final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
    contactos.forEach(contacto -> {
        try {
            b.write((contacto.toString() + "\n").getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}catch (IOException ex) {
   ex.printStackTrace();
}


quedando

Código (java) [Seleccionar]
private void writeFileTo() {
       final List<ContactoDemo> contactos = new ArrayList<>();
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       contactos.add(new ContactoDemo("victor96", 32525, "oculto"));
       new Thread(() -> {
           final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
           if (!Files.exists(dir)) {
               try {
                   Files.createDirectory(dir);
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
           try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
               contactos.forEach(contacto -> {
                   try {
                       b.write((contacto.toString() + "\n").getBytes());
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               });
           } catch (IOException ex) {
               ex.printStackTrace();
           }
       }).start();
   }


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

victor96

#2
He probado el código que me has proporcionado, pero sigo teniendo un error que no se como solucionar:

He probado a debuggear el programa para ver que es lo que falla y me aparece que el fallo se encuentra en la linea 10, justo la linea que crea el archivo.

Este es el codigo que probe:

@RequiresApi(api = Build.VERSION_CODES.O)
   private void escribirDatosContactos(List contactos) {


       new Thread(() -> {
           final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
           if (!Files.exists(dir)) {
               try {
                   
                   Files.createDirectory(dir);
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
           try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
               contactos.forEach(contacto -> {
                   try {
                       b.write((contacto.toString() + "\n").getBytes());
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               });
           } catch (IOException ex) {
               ex.printStackTrace();
           }
       }).start();
   } @RequiresApi(api = Build.VERSION_CODES.O)
   private void escribirDatosContactos(List contactos) {


       new Thread(() -> {
           final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
           if (!Files.exists(dir)) {
               try {
                   
                   Files.createDirectory(dir);
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
           try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
               contactos.forEach(contacto -> {
                   try {
                       b.write((contacto.toString() + "\n").getBytes());
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               });
           } catch (IOException ex) {
               ex.printStackTrace();
           }
       }).start();
   }


Y esta es la excepción que me aparece en el debugger:

e: "java.nio.file.AccessDeniedException: /storage/emulated/0/Contactos"

Al ser AccessDeniedException he pensado que podria ser por falta de permisos en la ruta, entonces he añadido estas dos lineas de codigo:

Código (java) [Seleccionar]
Path dirabsoluta= Environment.getExternalStorageDirectory().toPath();

Files.setPosixFilePermissions(dirabsoluta, PosixFilePermissions.fromString("rwxrwxrwx"));


Antes de crear el directorio, pero me sigue apareciendo el mismo error a pesar de que le concedo todos los permisos para crear la carpeta allí

No se que puede ser la verdad

rub'n

#3
Hola,

Bueno como decia Jack aka el popular the Ripper(destripador), empecemos por partes
     

Usa geshi, por segunda vez  :xD


  • Versión de Api que estas usando
  • Añadiste los permisos en el AndroidManifest.xml
  • Pregunta importante donde deseas escribir? en un directorio publico o privado?

y de paso tu  metodo

Código (java) [Seleccionar]

private void escribirDatosContactos(List contactos) {}


No usas el parámetro entrante ahí correspondiente a la linea 10 dog


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

victor96

Gracias de nuevo por tu ayuda, te contesto a todas:

1. Creo que mi version es la 4.03(15), pero como puedes ver en el código, puse para que pueda permitir hasta la versión oreo(26)

Código (java) [Seleccionar]
@RequiresApi(api = Build.VERSION_CODES.O)

2. Los permisos los tengo metidos fuera de la aplicacion te pongo el androidmanifest para que lo puedas ver completo:

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.victor.miscompaneros">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:screenOrientation="fullSensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".menucontactos" android:screenOrientation="fullSensor"></activity>
        <activity android:name=".editarcontacto" android:screenOrientation="fullSensor"></activity>
    </application>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />



</manifest>


3. No me importa realmente si es en uno publico o en uno privado, el que de menos problemas para escribir.

4. Si que uso el parámetro, lo que pasa es que lo tengo declarado en otra parte del programa de esta forma:

Código (java) [Seleccionar]
final List<Contacto> contactos = new ArrayList<>();

Y luego entra en un metodo como parametro

Código (java) [Seleccionar]
escribirDatosContactos(contactos);

No quiero poner el código completo del programa porque es muy largo, disculpas si te ha podido confundir, si necesitas mas lineas de código dímelo.

rub'n

#5
dog esa anotación por alguna razón vía reflection no esta haciendo el trabajo, todo lo hice con la ultima API de android, si estas usando un api tan vieja sera por tus requerimientos  :-\ , algo pasa por ahí q no logro ver aun, baje hasta la api ICE CREAM

logro escribir el archivo en la sdDcard /Contactos/contactos.txt y visualizarlo por el Device File Explorer de momento

me reporto luego...



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

victor96

Pues lo único que se me ocurre es pasarte el código completo, haber si puedes ver el fallo :S

Editar contacto.java

Código (java) [Seleccionar]
package com.example.victor.miscompaneros;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermissions;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class editarcontacto  extends AppCompatActivity implements Serializable{



    TextView campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, advertencia1;

    Integer telefono;
    String nombre, papellido, sapellido, direccion, poblacion;
    private static final int PICK_IMAGE = 100;
    Uri imageUri;
    ImageView foto_gallery;
    Button boton1;
    LocalDate fechanacimiento;
    TableLayout lista;
    static int contGlobal=0;



    TableRow tabla2, tabla3, tabla4, tabla5, tabla6, tabla7, tabla8, tabla9;

    int filas = 0, columnas = 0;

    //static ArrayList<Contacto> contactos = new ArrayList<Contacto>();
    final List<Contacto> contactos = new ArrayList<>();

    int i = 0;

    /*String ruta ="/home/miscompaneros/contactos.txt";
    File archivo = new File(this.getExternalFilesDir("hola"));*/
    //File archivo = new File(this.getExternalFilesDir(null),"hola");




    @Override
    @TargetApi(Build.VERSION_CODES.P)
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.editarcontacto);




        //se asigna el campo de texto a la id que deseamos
        campo1 = (TextView) findViewById(R.id.campo1);
        campo2 = (TextView) findViewById(R.id.campo2);
        campo3 = (TextView) findViewById(R.id.campo3);
        campo4 = (TextView) findViewById(R.id.campo4);
        campo5 = (TextView) findViewById(R.id.campo5);
        campo6 = (TextView) findViewById(R.id.campo6);
        campo7 = (TextView) findViewById(R.id.campo7);
        campo8 = (TextView) findViewById(R.id.textView2);
        foto_gallery = (ImageView) findViewById(R.id.imageView);
        boton1 = (Button) findViewById(R.id.button7);
        lista = (TableLayout) findViewById(R.id.lista);


        //definimos las tablas

        tabla2 = (TableRow) findViewById(R.id.tabla2);
        /*tabla3= (TableRow) findViewById(R.id.tabla3);
        tabla4= (TableRow) findViewById(R.id.tabla4);
        tabla5= (TableRow) findViewById(R.id.tabla5);
        tabla6= (TableRow) findViewById(R.id.tabla6);
        tabla7= (TableRow) findViewById(R.id.tabla7);
        tabla8= (TableRow) findViewById(R.id.tabla8);
        tabla9= (TableRow) findViewById(R.id.tabla9);
        */




        advertencia1 = (TextView) findViewById(R.id.textView3);

        //if (contactos.size()>=1) {

            //cargardatosentabla();
        //}


        foto_gallery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery();
            }
        });


        Intent intent = getIntent();
        //Le llega la accion que debe tomar
        Bundle extras = intent.getExtras();

        int dato = extras.getInt("DATO");

        if (dato == 1) {
            campo8.setText("AÑADIR CONTACTO");
            boton1.setText("Añadir");

        }

    }

    /*private void cargardatosentabla() {

        TextView textview1 = (TextView) findViewById(R.id.textView10);
        TextView textview2 = (TextView) findViewById(R.id.textView11);
        TextView textview3 = (TextView) findViewById(R.id.textView12);
        TextView textview4 = (TextView) findViewById(R.id.textView13);

        for (int cont=0;cont<contactos.size();cont++)
        {
            String n = contactos.get(i).getNombre();
            String apellido1 = contactos.get(i).getPapellido();
            String apellido2 = contactos.get(i).getSapellido();
            String apellidos = apellido1 + " " + apellido2;
            Integer telefono = contactos.get(i).getTelefono();
            String poblacion = contactos.get(i).getPoblacion();
            //LocalDate f = contactos.get(i).getFechanacimiento();


            //añadimos los atributos a sus respectivo texto

            textview1.setText(n);
            textview2.setText(apellidos);
            textview3.setText(String.valueOf(telefono));
            textview4.setText(poblacion);
        }
    }*/

    public void metodo_iniciar(View view) {

        Intent intent = new Intent(getApplicationContext(), menucontactos.class);
        intent.putExtra("DATO", 1);
        startActivity(intent);
        finish();
    }

    @TargetApi(Build.VERSION_CODES.P)
    public void metodo_editar2(View view) throws IOException, ClassNotFoundException {

        setContentView(R.layout.menucontactos);

        //fila1
        TextView textview1 = (TextView) findViewById(R.id.textView10);
        TextView textview2 = (TextView) findViewById(R.id.textView11);
        TextView textview3 = (TextView) findViewById(R.id.textView12);
        TextView textview4 = (TextView) findViewById(R.id.textView13);
        Button button1 = (Button) findViewById(R.id.button1);

        //fila2
        TextView textview20 = (TextView) findViewById(R.id.textView20);
        TextView textview21 = (TextView) findViewById(R.id.textView21);
        TextView textview22 = (TextView) findViewById(R.id.textView22);
        TextView textview23 = (TextView) findViewById(R.id.textView23);
        Button button2 = (Button) findViewById(R.id.button2);

        //se añade el contacto

        nombre = campo1.getText().toString();
        papellido = campo2.getText().toString();
        sapellido = campo3.getText().toString();
        direccion = campo4.getText().toString();
        poblacion = campo6.getText().toString();
        try {
            telefono = Integer.parseInt(campo5.getText().toString());
        } catch (Exception e) {

            advertencia1.setText("INTRODUZCA UN TELEFONO CORRECTO");
            advertencia1.setVisibility(View.VISIBLE);
        }
        try {
            fechanacimiento = LocalDate.parse(campo7.getText().toString());


            //convertimos la fecha tipo date en local date
            //fechanacimiento = fechanacimiento.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

            LocalDate fechaactual = LocalDate.now();
            LocalDate birthday = LocalDate.of(fechaactual.getYear(), fechanacimiento.getMonthValue(), fechanacimiento.getDayOfMonth());
            if (fechaactual.isAfter(birthday))
                birthday = birthday.plusYears(1);
            Period diff = Period.between(fechaactual, birthday);
            Contacto contacto = new Contacto(nombre, papellido, sapellido, direccion, poblacion, R.drawable.agenda, telefono, fechanacimiento);

            contactos.add(contacto);


            // se añade el array a la tabla del menu superior


            do {


                String n = contactos.get(i).getNombre();
                String apellido1 = contactos.get(i).getPapellido();
                String apellido2 = contactos.get(i).getSapellido();
                String apellidos = apellido1 + " " + apellido2;
                Integer telefono = contactos.get(i).getTelefono();
                String poblacion = contactos.get(i).getPoblacion();
                //LocalDate f = contactos.get(i).getFechanacimiento();


                //añadimos los atributos a sus respectivo texto
                switch(i) {
                    case 0: textview1.setText(n);
                    textview2.setText(apellidos);
                    textview3.setText(String.valueOf(telefono));
                    textview4.setText(poblacion);
                    button1.setVisibility(View.VISIBLE);
                    break;

                    case 1:
                        textview20.setText(n);
                        textview21.setText(apellidos);
                        textview22.setText(String.valueOf(telefono));
                        textview23.setText(poblacion);
                        button2.setVisibility(View.VISIBLE);
                        break;
                }

                //convertimos fecha en string para poder añadirla al texto
                //String fechatexto = contactos.get(i).convertirfecha(contactos.get(i).getFechanacimiento());

                //textofecha.setText(fechatexto);

                //escribirDatosContactos();

                i++;

            } while (i < (contactos.size() - 1));

            //Guarda estado de actividad antes de cerrarla
            escribirDatosContactos(contactos);


        } catch (Exception e) {

            Logger.getLogger(editarcontacto.class.getName()).log(Level.SEVERE, null, e);
            //e.printStackTrace();
            advertencia1.setText("INTRODUZCA UNA FECHA CORRECTA");
            advertencia1.setVisibility(View.VISIBLE);
        }

        //cerramos esta actividad
        finish();

        //iniciamos la actividad desde menucontactos
        Intent intent = new Intent(getApplicationContext(), menucontactos.class);
        intent.putExtra("DATO",1);
        startActivity(intent);

            leerFichContactos(contactos);


    }


    private void openGallery() {
        Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
        startActivityForResult(gallery, PICK_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) {
            imageUri = data.getData();
            foto_gallery.setImageURI(imageUri);
        }
    }


    /*@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    static void leerFichContactos(File archivo) throws IOException, ClassNotFoundException {

        if(archivo.exists()) {
            FileInputStream fileIn = new FileInputStream(archivo);
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);
            contactos = (ArrayList<Contacto>) objectIn.readObject();
            objectIn.close();

            ObjectInputStream leyendoFichero = new ObjectInputStream(new FileInputStream("ruta"));
            contactos = (ArrayList<Contacto>) leyendoFichero.readObject();
            leyendoFichero.close();
        }

    }*/
    @RequiresApi(api = Build.VERSION_CODES.N)
    private String leerFichContactos(List contactos) {
        final StringBuilder sb = new StringBuilder();
        try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {

            bR.lines().forEach(texto -> sb.append(texto+"\n"));

        } catch (IOException ex) { ex.printStackTrace(); }
        return sb.toString();
    }


    /*@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    static void escribirDatosContactos(File archivo) throws IOException {



        if(!archivo.exists()) {
            archivo.getParentFile().mkdirs();
            archivo.createNewFile();
        }
        else{
            FileOutputStream fout=new FileOutputStream("/home/miscompaneros/contactos.txt");
            ObjectOutputStream out= new ObjectOutputStream(fout);
            out.writeObject(contactos);
            out.close();
        }


    }*/

    @RequiresApi(api = Build.VERSION_CODES.O)
    private void escribirDatosContactos(List contactos) {


        new Thread(() -> {
            final Path dir = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos").toString());
            if (!Files.exists(dir)) {
                try {

                    Files.createDirectory(dir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            final Path dir2 = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
            try (final BufferedOutputStream b = new BufferedOutputStream(Files.newOutputStream(dir2))) {
                contactos.forEach(contacto -> {
                    try {
                        b.write((contacto.toString() + "\n").getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }).start();
    }

    }



rub'n

#7
Hola, bueno bueno ok retomemos

Usa esta api, que es la ultima control + alt + s y en el buscador escribe android sdk



Como vas a usar otra api, debes crear una nueva unidad virtual, si por alguna razon no te quiera iniciar el .apk diciendo waiting for target device to come online android hazle wipe data como en la imagen siguiente



en tu archivo de compilación de gradle Module:app

Código (xml) [Seleccionar]

android {
   compileSdkVersion 28
   defaultConfig {
       applicationId "com.example.victor.miscompaneros"
       minSdkVersion 16
       targetSdkVersion 28
       versionCode 1
       versionName "1.0"
       testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}



este método lo vamos a invocar en la clase EditarContacto.java(Las clases se escriben con mayúsculas) en el onCreate() por ejemplo.
porque desde Marshmallow o superiores el código de solicitud 112 nos da permisos, en tiempo de ejecución


Código (java) [Seleccionar]

private void checkPermisosEnSdCard() {
    //chekea si esta applicacion tienes permisos de lectura/escritura
   int permisosSdCard = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    //Si no posee permisos, los otorga para almacenamiento externo
   if(permisosSdCard != PackageManager.PERMISSION_GRANTED) {
       //Solicita por medio de una notificacion que esta app va a escribir en el la sd
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 112);
   }

}


Pues anteriormente leemos el archivo .txt cuando estaba en el directorio privado de la siguiente manera, bueno yo, tu no podías  :xD

Código (java) [Seleccionar]

//este metodo no es que no sirva, pero si vamos a leer ahora desde un directorio publico pues
@RequiresApi(api = Build.VERSION_CODES.N)
private String leerFichContactos(List contactos) {
   final StringBuilder sb = new StringBuilder();
   try(final BufferedReader bR = new BufferedReader(new InputStreamReader(openFileInput("contactos.txt")))) {
     
       bR.lines().forEach(texto -> sb.append(texto+"\n"));

   } catch (IOException ex) { ex.printStackTrace(); }
   return sb.toString();
}


Ahora así, no te dejes intimidar por el lijero cambio es casi lo mismo, en realidad no  me gusta ese InputStreamReader  :xD, y tambien que no necesitamos a openFileInput que retorna un FileInputStream, pero del directorio privado, no es este caso, estamos escribiendo y leyendo desde el public dir dog



No hace falta que le pases la lista como parámetro, porque leeremos desde el directorio
Código (java) [Seleccionar]

@RequiresApi(api = Build.VERSION_CODES.O)
private String leerFichContactos() {
   final StringBuilder sb = new StringBuilder();
   final Path path = Paths.get(Environment.getExternalStoragePublicDirectory("/Contactos/contactos.txt").toString());
   try (final BufferedReader reader = Files.newBufferedReader(path,StandardCharsets.UTF_8)) {

       reader.lines().forEach(texto -> sb.append(texto + "\n"));

   } catch (IOException ex) {
        ex.printStackTrace();
   }
       return sb.toString();
}


Otras cosas que se me había olvidado, por ejemplo para hacer el trabajo casi completo, bueno hasta que apliques todo lo que te menciono, si por casualidad no encuentras el directorio en el emulador, en archivos, en la esquina superior derecha debes darle mostrar almacenamiento interno.

En la linea 235, tu clase Contacto, tienes un contructor telescópico, cuando tengas una clase con unos 3 parámetros o mas, aplica
patron builder, la hará mas legible, mantenible etc.


yyyyy el método escribirDatosContactos()  :xD

lo primero que te mostré recuerda que en tu clase Contacto debes tener sobrescrito el método toString() si o si para este ejemplo, en el Android Studio oprime alt + insertar, y ahí puedes crear el toString() ya configurado con todas las instancias concatenadas.



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

victor96

Ya he conseguido que me guarde el fichero, muchas gracias, pero si quisiera cargar cada dato del   array y cargarlo en mi tablerow como podría hacerlo?