Сохранение выбранной картинки и ее автоматическая загрузка при запуске приложения

При нажатии на кнопку open открывается галерея, после чего imageView отображает выбранное пользователем изображение. Это работает, но как сделать, чтобы это изображение сохранялось, и автоматически подгружалось при запуске приложения? Я нашел способ, но мне не удается встроить его конкретно в этот код:

package com.dennysnumb.app;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.content.SharedPreferences;



import java.io.File;

public class MainActivity extends AppCompatActivity {

Button open;
ImageView photoRegistration;
SharedPreferences sharedpreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    sharedpreferences = getSharedPreferences("app_data", Context.MODE_PRIVATE);
    String saved = sharedpreferences.getString("path", "");
    photoRegistration = (ImageView)findViewById(R.id.imageView);
    photoRegistration.setImageURI(Uri.fromFile(new File(saved )));



    open = (Button) findViewById(R.id.opgalbtn);
    open.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
            photoPickerIntent.setType("image/*");
            final int SELECT_PHOTO = 1234;
            startActivityForResult(photoPickerIntent, SELECT_PHOTO);
        }
    });

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    switch (requestCode) {
        case 1234:
            if (resultCode == RESULT_OK) {
                Uri selectedImage = imageReturnedIntent.getData();
                ImageView photoRegistration = (ImageView) findViewById(R.id.imageView);
                photoRegistration.setImageURI(selectedImage);

                String pathData = selectedImage.toString();
                SharedPreferences.Editor editor = sharedpreferences.edit();
                editor.putString("path", pathData).apply();
            }
    }
}
}

Ответы (1 шт):

Автор решения: Andrew

Так как у вас картинка будет в галерее и после закрытия приложения, я бы советовал вам сохранять не картинку, а путь к ней. Дальше при запуске приложения, вам просто нужно будет взять сохраненный путь и оттуда достать картинку. Чтобы сохранить путь, можно использовать SharedPreferences. При выборе картинки берете путь и сохраняете его в памяти. Перед функцией onCreate() делаете глобальную переменную:

SharedPreferences sharedpreferences

дальше в функции onCreate() эту переменную инициализируете:

sharedpreferences = getSharedPreferences("app_data", Context.MODE_PRIVATE);

дальше в функции onActivityResult добавляете этот код:

String pathData = selectedImage.toString();
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("path", pathData).apply();

в качестве данных для сохранения берем то что возвращает intent:

Uri selectedImage = imageReturnedIntent.getData();

и дальше при загрузке приложения в функции onCreate() берете путь из памяти:

sharedpreferences.getString("path", "")

И дальше уже все то же самое что вы делаете при выборе картинки через диалог. Вот туториал как работать с настройками. Возьмем ситуацию, когда пользователь удалил картинку из галереи. Чтобы приложение работало и дальше без сбоев, можно сохранить картинку в папку приложения, куда пользователь доступа чаще всего не имеет. Это делается так:

File source = new File(imageReturnedIntent.getData().toString());
File destination =  getFilesDir();
try 
{
 FileUtils.copyFile(source, destination);
} 
catch (IOException e) 
{
  e.printStackTrace();
}

и теперь у вас есть как-бы резервная копия вашей картинки на случай ее удаления из галереи. Вот интересные статья_1, статья_2 которые будут полезны при решении вашей проблемы.

→ Ссылка