Cómo guardar la imagen en preferencia compartida en Android | Problema de preferencia compartida en Android con imagen

En mi aplicación después de iniciar sesión, tengo que guardar el nombre de usuario y la imagen en preferencia compartida para otras páginas. Puedo guardar el nombre con preferencia pero no puedo encontrar dónde guardar la imagen.

Estoy intentando algo como eso-

SharedPreferences myPrefrence; String namePreferance="name"; String imagePreferance="image"; SharedPreferences.Editor editor = myPrefrence.edit(); editor.putString("namePreferance", itemNAme); editor.putString("imagePreferance", itemImagePreferance); editor.commit(); 

Estoy tratando de guardar la imagen como una cadena después de convertirla en objeto. Pero cuando lo reconvirtí en bitmap no obtuve nada.

He resuelto tu problema, haz algo como eso:

  1. Método de escritura para codificar su bitmap en string base64-

     // method for bitmap to base64 public static String encodeTobase64(Bitmap image) { Bitmap immage = image; ByteArrayOutputStream baos = new ByteArrayOutputStream(); immage.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); Log.d("Image Log:", imageEncoded); return imageEncoded; } 
  2. Pase su bitmap dentro de este método como algo de su preferencia:

     SharedPreferences.Editor editor = myPrefrence.edit(); editor.putString("namePreferance", itemNAme); editor.putString("imagePreferance", encodeTobase64(yourbitmap)); editor.commit(); 
  3. Y cuando desee mostrar su imagen en cualquier lugar, conviértala de nuevo en un bitmap utilizando el método de deencoding:

     // method for base64 to bitmap public static Bitmap decodeBase64(String input) { byte[] decodedByte = Base64.decode(input, 0); return BitmapFactory .decodeByteArray(decodedByte, 0, decodedByte.length); } 
  4. Pase su cadena dentro de este método y haga lo que quiera.

 Finally I solved this problem. 

Paso: – 1. Escribí un código en onCreate () para obtener datos de intención de la actividad anterior

  private Bitmap bitmap; Intent intent = getIntent(); if (getIntent().getExtras() != null) { // for get data from intent bitmap = intent.getParcelableExtra("PRODUCT_PHOTO"); // for set this picture to imageview your_imageView.setImageBitmap(bitmap); sharedPreferences(); }else { retrivesharedPreferences(); } 

2 crear sharedPreferences () y poner este código

  private void sharedPreferences() { SharedPreferences shared = getSharedPreferences("App_settings", MODE_PRIVATE); SharedPreferences.Editor editor = shared.edit(); editor.putString("PRODUCT_PHOTO", encodeTobase64(bitmap)); editor.commit(); } 

3 crea retrivesharedPreferences () este método y coloca este código,

 private void retrivesharedPreferences() { SharedPreferences shared = getSharedPreferences("MyApp_Settings", MODE_PRIVATE); String photo = shared.getString("PRODUCT_PHOTO", "photo"); assert photo != null; if(!photo.equals("photo")) { byte[] b = Base64.decode(photo, Base64.DEFAULT); InputStream is = new ByteArrayInputStream(b); bitmap = BitmapFactory.decodeStream(is); your_imageview.setImageBitmap(bitmap); } } 

4 Escribe encodeTobase64 () Método para codificar tu bitmap en string base64- y pon el código en este método

  public static String encodeTobase64(Bitmap image) { Bitmap bitmap_image = image; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap_image.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); return imageEncoded; } 

Espero que te sea útil.

Codificar a Base64 ?! ¡Eso es una locura! Esa es demasiada información que está almacenando en las preferencias compartidas. La estrategia que debe seguir es guardar la ruta del archivo URI de la imagen y recuperarla como tal. De esta forma, su aplicación no almacenará tanta información y se convertirá en un cerdo de la memoria al decodificar la imagen.

Hice una aplicación simple en Github para demostrar esta idea, si quieres seguir:

1. Declara las variables:

 private ImageView mImage; private Uri mImageUri; 

2. Seleccione la imagen:

 public void imageSelect() { Intent intent; if (Build.VERSION.SDK_INT < 19) { intent = new Intent(Intent.ACTION_GET_CONTENT); } else { intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); } intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } 

3. Guarde el URI de la imagen:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Check which request we're responding to if (requestCode == PICK_IMAGE_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // The user picked a image. // The Intent's data Uri identifies which item was selected. if (data != null) { // This is the key line item, URI specifies the name of the data mImageUri = data.getData(); // Removes Uri Permission so that when you restart the device, it will be allowed to reload. this.grantUriPermission(this.getPackageName(), mImageUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); final int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION; this.getContentResolver().takePersistableUriPermission(mImageUri, takeFlags); // Saves image URI as string to Default Shared Preferences SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = preferences.edit(); editor.putString("image", String.valueOf(mImageUri)); editor.commit(); // Sets the ImageView with the Image URI mImage.setImageURI(mImageUri); mImage.invalidate(); } } } } 

4. Recupere el URI de la imagen cuando sea necesario:

 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String mImageUri = preferences.getString("image", null); mImage.setImageURI(Uri.parse(mImageUri)); 

¡Eso es! Ahora hemos guardado limpiamente la ruta uri de la imagen a las preferencias compartidas, y no hemos desperdiciado valiosos recursos del sistema codificando la imagen y guardándola en SharedPreferences.

 //Thanks Maish srivastava // i will do complete code just copy past and run it sure worked it // public class MainActivity extends Activity implements OnClickListener { private static int RESULT_LOAD_IMAGE = 1; public static final String MyPREFERENCES = "MyPre" ;//file name public static final String key = "nameKey"; SharedPreferences sharedpreferences ; Bitmap btmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); if (sharedpreferences.contains(key)) { String u=sharedpreferences.getString(key, ""); btmap=decodeBase64(u); ImageView iv = (ImageView) findViewById(R.id.imageView1); iv.setImageBitmap(btmap); } ImageButton imgbtn=(ImageButton) findViewById(R.id.imageButton1); imgbtn.setOnClickListener(this); } public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.imageButton1: try { //go to image library and pick the image Intent i=newIntent(ntent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); } catch (Exception e) { e.printStackTrace(); } break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); ImageView iv = (ImageView) findViewById(R.id.imageView1); iv.setImageBitmap(BitmapFactory.decodeFile(picturePath)); btmap=BitmapFactory.decodeFile(picturePath);//decode method called Editor editor = sharedpreferences.edit(); editor.putString(key, encodeTobase64(btmap)); editor.commit(); } } public static String encodeTobase64(Bitmap image) { Bitmap immage = image; ByteArrayOutputStream baos = new ByteArrayOutputStream(); immage.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); Log.d("Image Log:", imageEncoded); return imageEncoded; } public static Bitmap decodeBase64(String input) { byte[] decodedByte = Base64.decode(input, 0); return BitmapFactory .decodeByteArray(decodedByte, 0, decodedByte.length); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }