#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)