¿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

Related Posts:

Girar Rectángulo con LibGDX – android libgdx
Pregunta: Estoy haciendo un programilla de prueba que se compone de : 4 botones , arriba, abajo, izquierda y derecha. Una nave espacial, formada por un ...
Botones con android y LibGDX – android libgdx
Pregunta: Buenas, he creado un pequeño boton en android, con libGDX muy sencillo, pero el problema es el siguiente: Le tengo asignada una funcion que escribe ...
¿Location manager Android? Experiencias – android mysql android-studio
Pregunta: He desarrollado una aplicación Gps que envía información a Mysql cada 10 seg atraves de locationmanager. ¿Según su experiencia hasta cuanto es posible disminuir ...
Tomcat no encuentra los recursos – java angularjs http
Pregunta: Bueno tengo una aplicación con AngularJS que hace peticiones al API de gitHub como un ejemplo para aprender a usar AngularJS, pero el problema ...
Crear cuenta regresiva N segundos mientras se visualiza una Activity en Android – java android
Pregunta: Quiero implementar una cuenta regresiva de N segundos, que se inicie cuando la Activity se muestre, se pare el contador cuando el usuario decide ...
Crear prototipos para aplicaciones Android – android prototipos
Pregunta: estoy interesado en optar por una herramienta que me sea bastante util para poder realizar prototipos de aplicaciones móviles, especificamente para Android. Empece buscando ...
¿Como Se Instala Un Apk Y Como Se Ve Despues? – android
Pregunta: Tengo una duda sobre que pasa con ese archivo apk una vez instalado si se queda como uno solo o se separa en fragmentos ...
¿Como usar la clase Intent para mostrar las apps del usuario – android android-intent
Pregunta: Quiero que mi app muestre las aplicaciones del usuario en un ListView. He tratado de investigar y me salio en ingles la mención a esta ...
Calcular distancia entre dos coordenadas android – android
Pregunta: quisiera saber como puedo hallar la distancia entre 2 coordenadas en kilómetros en trayecto vía automóvil, estoy usando la API de google maps. Agradezco cualquier ...
¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi app? – java woocommerce
Pregunta: ¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi programa? Supongamos que quiero hacer una aplicación como la de ebay, ...
Problema con consulta JPQL + JPA + JSF + EJB – java jsf jpa
Pregunta: @Override public Usuario iniciarSesion(Usuario us){ Usuario usuario = null; String consulta; try { ...
No encuentra el audio dentro de src – java
Pregunta: Tengo una carpeta "audios" dentro de "src", para cuando construya el proyecto pueda reproducir los audios. Intento abrir el audio pero me salta "java.lang.NullPointerException" ...
¿Cómo puedo crear una aplicación Android que no se pueda cerrar así como WhatsApp? – android android
Pregunta: Esta pregunta ya tiene una respuesta aquí: ...
¿Como saber con Apache POI y java si una columna en excel esta oculta? – java apache-poi
Pregunta: Hola estoy importando archivos excel con extensión xls y xlsx pero mi duda es como poder detectar si la columna de una celda esta ...
Spinner y EditText – java android
Pregunta: Tengo este código para cargar un spinner con datos de una base de datos: private class Getfrutas extends AsyncTask<Void, Void, Void> { ...

Add a Comment

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