¿Cómo guardar un ImageView en Android? – java android

Pregunta:


Mi aplicación está compuesta por un botón y un ImageView y cuando se aprieta el botón la ImageView recibe una imagen que tengo en el drawable. Lo que quiero hacer es guardar esa imagen y que cuando el usuario vuelva a abrir la aplicación la imagen aún esté ahí.

El problema es que no entiendo cómo guardar esa imagen y si conviene guardarla en la memoria interna o externa.

Quisiera algún ejemplo de eso.

Gracias por las respuestas, este es el código que tengo hasta ahora. Al apretar el botón muestro una imagen que convierto a base64 y la guarda al iniciar la aplicación, otra vez lee lo almacenado, y muestra la imagen, pero me tira error cuando presiono el botón.

public class MainActivity extends AppCompatActivity {

    ImageView imagen;
    Button boton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imagen = (ImageView) findViewById(R.id.imagen);
        boton = (Button) findViewById(R.id.boton);

        SharedPreferences preferences = getSharedPreferences("PREF_NAME", MODE_PRIVATE);
        String val = preferences.getString("Imagen", null);

        if (val != null) {
            byte[] data = Base64.decode(val, Base64.DEFAULT);
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            Drawable d = new BitmapDrawable(getResources(), bitmap);
            imagen.setImageDrawable(d);
        }
    }

    public void boton(View view){

        imagen.setImageResource(R.drawable.imagen1);

        imagen.buildDrawingCache();
        Bitmap bmap = imagen.getDrawingCache();

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();

        String base64_imagen = Base64.encodeToString(byteArray, Base64.DEFAULT);

        SharedPreferences preferences = getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("Imagen", base64_imagen);
        editor.apply();


    }
}

Preguntado por: Zekirak

Como guardar un image view en android?

Esto no se puede realizar, lo que deseas es guardar la imagen que tienes en un ImageView a memoria interna o externa.

Primeramente obtienes la imagen que se encuentra en el ImageView como mapa de bits por medio del método getDrawingCache()

myImageView.buildDrawingCache();
Bitmap bitmap = myImageView.getDrawingCache();

al obtener el bitmap de la imagen procedemos a guardarla, considero que el lugar optimo es guardarla en memoria externa para evitar problemas cuando tu aplicación se instale en distintos dispositivos con distintas características :

OutputStream fileOutStream = null;
Uri uri;
try {
    File file = new File(Environment.getExternalStorageDirectory()
        + File.separator + "imagenesguardadas" + File.separator);
    file.mkdirs();
    File directorioImagenes = new File(file, "mi_imagen.jpg");
    uri = Uri.fromFile(directorioImagenes);
    fileOutStream = new FileOutputStream(directorioImagenes);
} catch (Exception e) {
    Log.e("ERROR!", e.getMessage());        
}

try {
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutStream);
    fileOutStream.flush();
    fileOutStream.close();
} catch (Exception e) {
  Log.e("ERROR!", e.getMessage());
}

Sin embargo si cargas una imagen dentro de un ImageView, debido a esto tal vez tienes tu imagen almacenada en los folders /drawable o /mipmap y no necesitarías guardarla, es importante agregues el código para saber como estas cargando la imagen dentro del ImageView originalmente.

Tienes varias opciones. Puedes guardar la imagen (el objeto Bitmap) como fichero JPG aunque te recomiendo que conviertas el Bitmap a un array de bytes (o byte[]) y lo pases a cadena de texto en base64.

// byte[] a cadena de texto
byte[] data = text.getBytes("UTF-8");
String base64_imagen = Base64.encodeToString(data, Base64.DEFAULT);

// a la inversa (para recuperar la imagen
byte[] data = Base64.decode(base64, Base64.DEFAULT);

Guarda el texto de la variable base64_imagen en la configuración de la app:

    // en tu actividad
    public String getImage() {
        SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
        String val = prefs.getString("app_image", null);
        return val;
    }

    public void setImage(String image) {
        SharedPreferences.Editor editor = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE).edit();
        editor.putString("app_image", image).apply();
    }

Haz el proceso a la inversa para obtener el Bitmap cuando lo necesites. De todas maneras si lo que quieres es que se conserve la actividad de tu app sin que se cierre, evita usar el método finish(). Emula el botón central de la interfaz para evitar que se cierre:

private void exit() {
    // finish();
    Intent i = new Intent(Intent.ACTION_MAIN);
    i.addCategory(Intent.CATEGORY_HOME);
    startActivity(i);
}

Actualmente, al darle al botón, en la imagen se coloca una imagen en tu imageview que ya existe en la carpeta drawable, y quieres que el usuario la vea sin tener que darle al botón. Existe un método en el XML llamado android:src que puedes establecer la ruta de la imagen que está en la carpeta drawable. Ahi estaría tu solución.

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *