Скачивание и сохранение пути к картинке в sharedPreferences

Всем привет! Столкнулся с проблемой сохранения пути к картинке в sharedPreference. Класс DownloadImageTask еще устанавливает в ImageView фото(это было его основной задачей, но потом стало нужно сохранять фото и путь к нему в памяти устройства). AS просто не видит метод getSharedPreferences(XML_PHOTO, MODE_PRIVATE). Помогите, пожалуйста) Класс загрузки фото:

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;
    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }
    protected Bitmap doInBackground(String... urls) {
        String urlDisplay = urls[0];
        Bitmap mIcon = null;
        try {
            InputStream in = new java.net.URL(urlDisplay).openStream();
            mIcon = BitmapFactory.decodeStream(in);

        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon;
    }
    protected void onPostExecute(Bitmap result) {
        SharedPreferences photoSharedPreferences = getSharedPreferences(XML_PHOTO, MODE_PRIVATE);
        SharedPreferences.Editor photoEditor = photoSharedPreferences.edit();
        bmImage.setImageBitmap(result);
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        result.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        File file = new File(Environment.getExternalStorageDirectory() + File.separator + "myBitmap.jpg");
        try {
            file.createNewFile();
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(bytes.toByteArray());
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        photoEditor.putString(SAVED_PHOTO_URI, file.getAbsolutePath()).apply();
    }
}

Его вызов в onCreate:

if (photoSharedPreferences.getString(SAVED_PHOTO_URI, "").length() < 1) {
            new DownloadImageTask(profileImage).execute(URL_WITHOUT_API + photoSharedPreferences.getString(SAVED_PHOTO_URL, ""));
}

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

Автор решения: Barmaley Red Star

Корень зла лежит здесь:

Environment.getExternalStorageDirectory()

Если вы прочтете диагностику компилятора, то заметите, что метод объявлен как deprecated, что означает в переводе на язык простых смертных: не пишите больше во внешнюю память!

А почему? Да потому что так решил Google.

Теперь, куда все таки можно писать?

  1. Писать в приватное место самого приложения: Context.getFilesDir()
  2. Писать в выделенное для проги место во внешней памяти (начиная с Android Q тоже уже закрыто) - Context.getExternalFilesDir()
  3. Писать в публичные места типа Environment.getExternalStoragePublicDirectory() - тоже с недавнего времени закрыт
  4. Писать в shared ресурсы. Теперь это единственный православный способ. Читайте документацию по scoped storage
→ Ссылка