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
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
Pues anteriormente leemos el archivo .txt cuando estaba en el directorio privado de la siguiente manera, bueno yo, tu no podías
Ahora así, no te dejes intimidar por el lijero cambio es casi lo mismo, en realidad no me gusta ese InputStreamReader , 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
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()
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.
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
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 , 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()
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.