Android: Как сохранить изображение в SharedPreferences для сохранения и извлечения?

#java #android #imageview #sharedpreferences #onactivityresult

Вопрос:

Я создаю приложение и в настоящее время задаюсь вопросом, как сохранить изображение в SharedPreferences, а затем получить то же самое изображение, пожалуйста, смотрите ниже код, который у меня есть относительно изображений. Что мне нужно добавить к этому?

  public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){
    super.onActivityResult(requestCode, resultCode, data);

    // Checks if the intent was able to pick the image and if it was successful
    if(requestCode == GALLERY_REQUEST amp;amp; resultCode == RESULT_OK amp;amp; data != null){

        // Get selected image uri from phone gallery
        Uri selectedImage = data.getData();

        // Display selected photo in image view
        imageView.setImageURI(selectedImage);
    }

    // Handle Camera Request
    else if(requestCode == CAMERA_REQUEST amp;amp; resultCode == RESULT_OK amp;amp; data != null){

        // Bitmap variable to store data
        Bitmap bitmap = (Bitmap)data.getExtras().get("data");

        // Display taken picture in image view
        imageView.setImageBitmap(bitmap);
    }


    else if (requestCode == GALLERY_REQUEST_AFTER amp;amp; resultCode == RESULT_OK amp;amp; data != null){

        Uri selectedImageAfter = data.getData();

        imageView2.setImageURI(selectedImageAfter);
    }

    else if (requestCode == CAMERA_REQUEST_AFTER amp;amp; resultCode == RESULT_OK amp;amp; data != null){

        Bitmap bitmapAfter = (Bitmap)data.getExtras().get("data");

        imageView2.setImageBitmap(bitmapAfter);
    }
}
 

Комментарии:

1. какое из них выбрано изображение или выбранное изображение после растрового изображения после ?

2. Я хотел бы сохранить растровое изображение в SharedPreferences

3. К сожалению, вы не можете этого сделать, но вы можете сохранить растровое изображение в виде файла в хранилище вашего устройства и сохранить путь к этому файлу с помощью SharedPreferences

4. Да, это тоже сработало бы, как я могу это сделать?

5. Чтобы все было проще, не могли бы вы объяснить мне, как работает ваше приложение, я вижу, что вы правильно получаете изображение или снимаете его с камеры

Ответ №1:

Если вы хотите сохранить и восстановить Bitmap связанное с ImageView , вы можете сохранить кодировку Base64 этого растрового изображения в SharedPreferences .

Вот пример,

 //get SharedPreferences
private static final String PREF_BITMAP_KEY = "PREF_BITMAP_KEY";
SharedPreferences prefs = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);

//get Bitmap and Base64 encoding
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

byte[] bytes = baos.toByteArray();
String b64 = Base64.encodeToString(bytes, Base64.DEFAULT);

//save in SharedPreference
prefs.edit().putString(PREF_BITMAP_KEY, b64);
prefs.edit().commit();
 

Чтобы восстановить растровое изображение:

 String b64 = prefs.getString(PREF_BITMAP_KEY, null); 
if (!TextUtils.isNullOrEmpty(b64)) {
  byte[] bytes = Base64.decode(b64, Base64.DEFAULT);
  Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
  imageView.setImageBitmap(bitmap);
}
 

Ответ №2:

Я всегда пользовался этой библиотекой, чтобы все было проще : implementation 'com.blankj:utilcodex:1.30.0'

Два приведенных ниже метода позволяют сохранить, а также сохранить путь к сохраненному изображению с помощью SharedPreferences

    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Checks if the intent was able to pick the image and if it was successful
        if (requestCode == GALLERY_REQUEST amp;amp; resultCode == RESULT_OK amp;amp; data != null) {

            // Get selected image uri from phone gallery
            Uri selectedImage = data.getData();

            // Display selected photo in image view
            imageView.setImageURI(selectedImage);

            //Store image path
            String imagePath = UriUtils.uri2File(selectedImage).getAbsolutePath();
            storeImage(imagePath);
        }

        // Handle Camera Request
        else if (requestCode == CAMERA_REQUEST amp;amp; resultCode == RESULT_OK amp;amp; data != null) {

            // Bitmap variable to store data
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");

            // Display taken picture in image view
            imageView.setImageBitmap(bitmap);


            //Save and store image path
            saveImage(bitmap);

        } else if (requestCode == GALLERY_REQUEST_AFTER amp;amp; resultCode == RESULT_OK amp;amp; data != null) {

            Uri selectedImageAfter = data.getData();

            imageView2.setImageURI(selectedImageAfter);
            
            
            //Store image path
            String imagePath = UriUtils.uri2File(selectedImageAfter).getAbsolutePath();
            storeImage(imagePath);
            
        } else if (requestCode == CAMERA_REQUEST_AFTER amp;amp; resultCode == RESULT_OK amp;amp; data != null) {

            Bitmap bitmapAfter = (Bitmap) data.getExtras().get("data");

            imageView2.setImageBitmap(bitmapAfter);


            //Save and store image path
            saveImage(bitmapAfter);
            
        }
    }


    public void storeImage(String imagePath) {
        SPUtils.getInstance().put("savedImage", imagePath);
    }

    public void saveImage(Bitmap bitmap) {
        //Save image to device storage
        File imageFile = new File(PathUtils.getExternalPicturesPath(), "cachedImage.jpg");
        boolean isSaved = ImageUtils.save(bitmap, imageFile, Bitmap.CompressFormat.JPEG);
        if (isSaved) storeImage(imageFile.getAbsolutePath());
    }
 

Чтобы получить сохраненное изображение, используйте следующее :

 public void loadImage() {
        //Load the saved Image
        String imagePath = SPUtils.getInstance().getString("savedImage");
        Glide.with(this)
                .asBitmap()
                .load(imagePath)
                .into(new CustomTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {

                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {

                    }
                });
    }
 

Комментарии:

1. Я реализовал : реализацию «com.blankj:utilcodex:1.30.0», и .getExternalPicturesPath, похоже, не работает

2. @Kevin обязательно импортируйте патутилы import com.blankj.utilcode.util.PathUtils;

3. Что вы имеете в виду под этим? .getExternalPicturesPath выделен красным цветом и не распознается

4. Да, это добавлено, к сожалению, все еще не работает

5. Ммм, странно, это должно сработать, измените его на getExternalFilesDir(Environment.DIRECTORY_PICTURES)