¿Cómo puedo almacenar imágenes usando la preferencia compartida en Android?

Quiero guardar imágenes en Android utilizando la preferencia compartida. Tengo dos clases de actividad, cuando hago clic en el botón de la primera actividad, invoco la segunda actividad y la segunda actividad muestra mi nombre preferido en una vista de lista y también restablece el fondo de pantalla de Android a la imagen que había establecido como fondo de pantalla preferido en el primera actividad.

Para la segunda actividad, el código es:

public class PreferencesActivityTest extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE); String prefName = myPrefs.getString("PREF_USERNAME", "nothing"); String wallPaper = myPrefs.getString("PREFS_NAME", null); if(wallPaper != null) { try { Bitmap bm = BitmapFactory.decodeFile("/data/misc/wallpaper/"+wallPaper); Log.d(getClass().getSimpleName(),"Wallpaper name is: "+ wallPaper); setWallpaper(bm); Toast.makeText(this, "Wall paper has been changed." + "You may go to the home screen to view the same", Toast.LENGTH_LONG).show(); } catch (FileNotFoundException fe){ Log.e(getClass().getSimpleName(),"File not found"); } catch (IOException ie) { Log.e(getClass().getSimpleName()," IO Exception"); } } ArrayList results = new ArrayList(); results.add("Your Preferred name is: " + prefName); this.setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,results)); } 

La primera actividad llama a la segunda actividad pero no llama if(wallPaper != null){}

¿Por qué no está funcionando?

No se recomienda almacenar la imagen en las preferencias de Compartir. Deberías guardar esa imagen en una tarjeta SD. Y luego almacenar la ruta de la imagen (desde una tarjeta SD) en las preferencias de Compartir como esta–

  SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this); Editor edit=shre.edit(); edit.putString("imagepath","/sdcard/imh.jpeg"); edit.commit(); 

y luego recuperar imagen de sdcard utilizando esta ruta

Todo lo que tienes que hacer es convertir tu imagen a su representación de cadena Base64 :

 Bitmap realImage = BitmapFactory.decodeStream(stream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); realImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); String encodedImage = Base64.encodeToString(b, Base64.DEFAULT); textEncode.setText(encodedImage); SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this); Editor edit=shre.edit(); edit.putString("image_data",encodedImage); edit.commit(); 

y luego, al recuperar, convertirlo de nuevo en bitmap:

 SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this); String previouslyEncodedImage = shre.getString("image_data", ""); if( !previouslyEncodedImage.equalsIgnoreCase("") ){ byte[] b = Base64.decode(previouslyEncodedImage, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length); imageConvertResult.setImageBitmap(bitmap); } 

Sin embargo, tengo que decirle que la compatibilidad con Base64 solo se incluyó recientemente en API8. Para orientar en la versión inferior de la API, primero debe agregarla. Afortunadamente, este chico ya tiene el tutorial necesario.

Además, he creado un ejemplo rápido y sucio que publico en github.

Hola amigos, obtuve la solución del problema anterior. Aquí publico mi código fuente completo para que otros puedan usar esta solución.

Esta es mi segunda solución a este problema, ya publico una respuesta, esta es una respuesta diferente para la misma pregunta. Cómo guardar la imagen en preferencia compartida en Android | Tema de preferencia compartida en Android con imagen .

Siga los pasos a continuación:

  1. Declarar bitmap y String como estáticos

     public static final String PRODUCT_PHOTO = "photo"; public static Bitmap product_image; 
  2. En onCreate () escribe un código.

     //---------set the image to bitmap product_image= BitmapFactory.decodeResource(getResources(), .drawable.logo); //____________convert image to string String str_bitmap = BitMapToString(product_image); //__________create two method setDefaults() andgetDefaults() setDefaults(PRODUCT_PHOTO, str_bitmap, this) getDefaults(PRODUCT_PHOTO, this); 
    1. escriba el código a continuación en los métodos

    Configurar valores predeterminados();

     public static void setDefaults(String str_key, String value, Context context) { SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor edit=shre.edit(); edit.putString(str_key, value); edit.apply(); } 

3.2.setDefaults ();

  public static String getDefaults(String key, Context context) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); return preferences.getString(key, null); } 
  1. BitMapToString ();

     public static String BitMapToString(Bitmap bitmap) { ByteArrayOutputStream baos=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG,100, baos); byte[] arr = baos.toByteArray(); return Base64.encodeToString(arr, Base64.DEFAULT); } 

    Ahora, si desea acceder a este archivo de imagen en otra actividad, siga los pasos a continuación.

  2. Declare String como estático

     public static final String PRODUCT_PHOTO = "photo"; String str_bitmap; private Bitmap bitmap; private ImageView imageView_photo; 

    En onCreate ():

      //--------get image form previous activity,here ProductActivity is my previous activity. str_bitmap =ProductActivity.getDefaults(PRODUCT_PHOTO, this); //-------------- decode the string to the bitmap bitmap=decodeBase64(str_bitmap); //----------- finally set the this image to the Imageview. imageView_photo.setImageBitmap(bitmap); 

para decodeBase64 ();

  public static Bitmap decodeBase64(String input) { byte[] decodedByte = Base64.decode(input, 0); return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); }