Загрузка изображений по url android studio

ImageView

Общая информация

Компонент ImageView предназначен для отображения изображений. Находится в разделе Widgets.

Для загрузки изображения в XML-файле используется атрибут android:src, в последнее время чаще используется атрибут app:srcCompat.

ImageView является базовым элементом-контейнером для использования графики. Можно загружать изображения из разных источников, например, из ресурсов программы, контент-провайдеров. В классе ImageView существует несколько методов для загрузки изображений:

  • setImageResource(int resId) — загружает изображение по идентификатору ресурса
  • setImageBitmap(Bitmap bitmap) — загружает растровое изображение
  • setImageDrawable(Drawable drawable) — загружает готовое изображение
  • setImageURI(Uri uri) — загружает изображение по его URI

Метод setImageResource()

Сначала нужно получить ссылку на ImageView, а затем используется идентификатор изображения из ресурсов:

Метод setImageBitmap()

Используется класс BitmapFactory для чтения ресурса изображения в объект Bitmap, а затем в ImageView указывается полученный Bitmap. Могут быть и другие варианты.

Метод setImageDrawable()

Если у вас есть готовое изображение, например, на SD-карте, то его можно использовать в качестве объекта Drawable.

Drawable можно получить и из ресурсов, хотя такой код выглядит избыточным, если можно сразу вызвать setImageResource().

Метод setImageURI()

Берётся URI файла изображения и используется в качестве источника изображения. Этот способ годится для работы с локальными изображениями.

Загружаем Drawable через URI.

Другие методы

Также вам часто придется использовать методы, связанные с размерами и масштабированием: setMaxHeight(), setMaxWidth(), getMinimunHeight(), getMinimunWidth(), getScaleType(), setScaleType().

Масштабирование через свойство Scale Type

Для масштабирования картинки в ImageView есть свойство Scale Type и соответствующий ему атрибут android:scaleType и перечисление ImageView.ScaleType.

  • CENTER
  • CENTER_CROP
  • CENTER_INSIDE
  • FIT_CENTER
  • FIT_START
  • FIT_END
  • FIT_XY
  • MATRIX

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

Для наглядности я задал красный цвет для фона ImageView.

Режим android:scaleType=»center» выводит картинку в центре без масштабирования. Если у вас будет картинка большего размера, то края могут быть обрезаны.

Режим android:scaleType=»centerCrop» также размещает картинку в центре, но учитывает ширину или высоту контейнера. Режим попытается сделать так, чтобы ширина (или высота) картинки совпала с шириной (или высотой) контейнера, а остальное обрезается.

Режим android:scaleType=»centerInside» масштабирует картинку, сохраняя пропорции. Можно увидеть задний фон контейнера, если его размеры отличаются от размера картинки.

Режим android:scaleType=»fitCenter» (по умолчанию) похож на предыдущий, но может не сохранять пропорции.

Если выбрать режим android:scaleType=»fitStart», то картинка прижимается к левому верхнему углу и таким образом заполняет верхнюю половину контейнера.

Значение android:scaleType=»fitEnd» сместит картинку в нижнюю часть контейнера.

Режим android:scaleType=»fitXY» растягивает/сжимает картинку, чтобы подогнать её к контейнеру. Может получиться вытянутая картинка, поэтому будьте осторожны.

Последний атрибут android:scaleType=»matrix» вывел картинку без изменений в левом верхнем углу с обрезанными краями.

Читайте также:  Виджет для андроид для вконтакте

Атрибут android:adjustViewBounds=»true»

При использовании атрибута scaleType=»fitCenter» из предыдущего примера Android вычисляет размеры самой картинки, игнорируя размеры ImageView. В этом случае ваша разметка может «поехать». Атрибут adjustViewBounds заставляет картинку подчиниться размеру компонента-контейнера. В некоторых случаях это может не сработать, например, если у ImageView установлен атрибут layout_width=»0dip». В таком случае поместите ImageView в RelativeLayout или FrameLayout и используйте значение 0dip для этих контейнеров.

Загрузка изображения из галереи

Предположим, у вас есть на экране компонент ImageView, и вы хотите загрузить в него какое-нибудь изображение из галереи по нажатию кнопки:

Намерение ACTION_PICK вызывает отображение галереи всех изображений, хранящихся на телефоне, позволяя выбрать одно изображение. При этом возвращается адрес URI, определяющий местоположение выбранного изображения. Для его получения используется метод getData(). Далее для преобразования URI-адреса в соответствующий экземпляр класса Bitmap используется специальный метод Media.getBitmap(). И у нас появляется возможность установить изображение в ImageView при помощи setImageBitmap().

На самом деле можно поступить ещё проще и использовать метод setImageURI.

Сравните с предыдущим примером — чувствуете разницу? Тем не менее, приходится часто наблюдать подобный избыточный код во многих проектах. Это связано с тем, что метод порой кэширует адрес и не происходит изменений. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri.

В последних версиях системных эмуляторов два примера не работают. Проверяйте на реальных устройствах.

Получить размеры ImageView — будьте осторожны

У элемента ImageView есть два метода getWidth() и getHeight(), позволяющие получить его ширину и высоту. Но если вы попробуете вызвать указанные методы сразу в методе onCreate(), то они возвратят нулевые значения. Можно добавить кнопку и вызвать данные методы через нажатие, тогда будут получены правильные результаты. Либо использовать другой метод активности, который наступает позже.

Копирование изображений между ImageView

Если вам надо скопировать изображение из одного ImageView в другой, то можно получить объект Drawable через метод getDrawable() и присвоить ему второму компоненту.

Примеры

В моих статьях можно найти примеры использования ImageView.

Источник

Лучший способ загрузки изображения с url в Android

Я использую ниже метод для загрузки одного изображения из URL

Иногда я получаю исключение outofmemory.

Я не могу исключить исключение из памяти. Приложение закроется. Как предотвратить это?

Есть ли лучший способ загрузки изображений, который также быстрее?

ОТВЕТЫ

Ответ 1

Попробуйте использовать это:

И для проблемы OutOfMemory:

Ответ 2

Я использую эту библиотеку, это действительно здорово, когда вам приходится иметь дело с большим количеством изображений. Он загружает их асинхронно, кэширует их и т.д.

Что касается исключений OOM, использование этого и этого класса резко сократило их для меня.

Ответ 3

Ответ 4

вы можете скачать изображение Asyn task используйте этот класс:

и назовите это так:

Ответ 5

Вы можете использовать функцию ниже, чтобы загрузить изображение с URL.

Смотрите полное объяснение здесь

Ответ 6

Добавьте эту зависимость для сети Android в свой проект

После запуска этого кода Проверка памяти телефона Вы можете увидеть там папку — ИзображениеПроверьте внутри этой папки, вы видите там файл изображения с именем «image.jpeg»

Ответ 7

Исключение OOM можно было бы избежать, следуя официальному руководству загрузить большое растровое изображение.

Читайте также:  Драйвер ккт атол для андроид

Не запускайте свой код в потоке пользовательского интерфейса. Используйте AsyncTask, и все будет в порядке.

Ответ 8

OUTPUT

Ответ 9

Шаг 1. Объявление разрешения в манифесте Android

Первое, что нужно сделать в своем первом Android-проекте, — это указать необходимые разрешения в файле ‘AndroidManifest.xml.

Для загрузки изображения Android с URL-адреса нам необходимо разрешение на доступ к Интернету для загрузки файла, чтения и записи во внутреннее хранилище для сохранения изображения во внутреннем хранилище.

Добавьте следующие строки кода в верхней части тега файла AndroidManifest.xml:

Шаг 2. Запросите требуемое разрешение у пользователя

Android позволяет запускать каждое приложение в песочнице. Если приложению требуется доступ к определенным ресурсам или информации за пределами этой изолированной программной среды, оно должно запросить разрешение у пользователя.

Начиная с Android 6.0, Google хочет, чтобы разработчики запрашивали разрешение у пользователя из приложения, чтобы узнать больше о разрешениях, прочитайте это.

Поэтому для загрузки изображения Android с URL-адреса вам потребуется запросить чтение хранилища и запись

Для этого мы будем использовать следующие строки кода, чтобы сначала проверить, предоставлено ли пользователю необходимое разрешение, а если нет, то мы запросим разрешение на чтение и запись в хранилище.

Мы создавали метод la Downlaod Image, вы можете просто вызывать его везде, где вам нужно загрузить изображение.

Теперь, когда мы запросили и получили разрешение пользователя, чтобы начать загрузку образа Android с URL-адреса, мы создадим AsyncTask, поскольку вам не разрешено запускать фоновый процесс в главном потоке.

В приведенных выше строках кода создается URL-адрес и растровое изображение, с использованием BitmapFactory.decodeStream файл загружается.

Путь к файлу создается для сохранения изображения (мы создали папку с именем AndroidDvlpr в DIRECTORY_PICTURES), и загрузка инициализируется.

После загрузки файла MediaScannerConnection вызывается для чтения метаданных из файла и добавления файла к поставщику медиа-контента, чтобы изображение было доступно для пользователя.

В приведенных выше строках кода мы также создали метод showToast() для отображения Toast. полный код здесь:

Ответ 10

Сначала объявите разрешение в манифесте Android: —

MainActivityForDownloadImages.java

DownloadService.java

Ответ 11

Я все еще изучаю Android, поэтому я не могу предоставить богатый контекст или причину моего предложения, но это то, что я использую для извлечения файлов из https и локальных URL-адресов. Я использую это в своем отчете onActivity (как для съемки, так и для выбора из галереи), а также в AsyncTask для извлечения https-адресов.

Источник

Как реализовать загрузку изображений в список в отдельном потоке на Android


По просьбам трудящихся, статья о методе загрузки изображений в список в отдельном потоке на Android.

Задача:

Реализовать механизм загрузки изображений из Интернета и отображения их в списке. При этом загрузка изображений должна быть реализована в отдельном потоке, во избежания «зависания» UI приложения.

Реализация:

Для реализации поставленной задачи использованы стандартный виджет ListView и адаптер — ArrayAdapter. Для работы с изображениями создан helper-класс ImageManager, который имеет два метода downloadImage() и fetchImage(). Первый загружает изображений из Интернета. Второй — вызывает загрузку изображений в отдельном потоке и устанавливает результат в ImageView.

Читайте также:  Wifire tv apk разблокированный для андроид тв

Пример испольования:

Реализацию поставленной задачи будем расматривать на примере моего проекта. И на его код я буду ссылаться в статье.
Исходники: fileshare.in.ua/3053597
APK: fileshare.in.ua/3053596

Описание реализации:

  1. package com.rudenko.android.ListIconFetching;
  2. import java.io.BufferedInputStream;
  3. import java.io.IOException;
  4. import java.net.HttpURLConnection;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;
  7. import android.graphics. Bitmap ;
  8. import android.graphics.BitmapFactory;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.util.Log;
  12. import android.widget.ImageView;
  13. public class ImageManager <
  14. private final static String TAG = «ImageManager» ;
  15. /** Private constructor prevents instantiation from other classes */
  16. private ImageManager () <>
  17. public static void fetchImage(final String iUrl, final ImageView iView) <
  18. if ( iUrl == null || iView == null )
  19. return ;
  20. final Handler handler = new Handler() <
  21. @Override
  22. public void handleMessage(Message message) <
  23. final Bitmap image = ( Bitmap ) message.obj;
  24. iView.setImageBitmap(image);
  25. >
  26. >;
  27. final Thread thread = new Thread() <
  28. @Override
  29. public void run() <
  30. final Bitmap image = downloadImage(iUrl);
  31. if ( image != null ) <
  32. Log.v(TAG, «Got image by URL: » + iUrl);
  33. final Message message = handler.obtainMessage(1, image);
  34. handler.sendMessage(message);
  35. >
  36. >
  37. >;
  38. iView.setImageResource(R.drawable.icon);
  39. thread.setPriority(3);
  40. thread.start();
  41. >
  42. public static Bitmap downloadImage( String iUrl) <
  43. Bitmap bitmap = null ;
  44. HttpURLConnection conn = null ;
  45. BufferedInputStream buf_stream = null ;
  46. try <
  47. Log.v(TAG, «Starting loading image by URL: » + iUrl);
  48. conn = (HttpURLConnection) new URL(iUrl).openConnection();
  49. conn.setDoInput( true );
  50. conn.setRequestProperty( «Connection» , «Keep-Alive» );
  51. conn.connect();
  52. buf_stream = new BufferedInputStream(conn.getInputStream(), 8192);
  53. bitmap = BitmapFactory.decodeStream(buf_stream);
  54. buf_stream.close();
  55. conn.disconnect();
  56. buf_stream = null ;
  57. conn = null ;
  58. > catch (MalformedURLException ex) <
  59. Log.e(TAG, «Url parsing was failed: » + iUrl);
  60. > catch (IOException ex) <
  61. Log.d(TAG, iUrl + » does not exists» );
  62. > catch (OutOfMemoryError e) <
  63. Log.w(TAG, «Out of memory. » );
  64. return null ;
  65. > finally <
  66. if ( buf_stream != null )
  67. try < buf_stream.close(); >catch (IOException ex) <>
  68. if ( conn != null )
  69. conn.disconnect();
  70. >
  71. return bitmap;
  72. >
  73. >

* This source code was highlighted with Source Code Highlighter .

Метод fetchImage():

public static void fetchImage(final String iUrl, final ImageView iView);

Входные параметры:

iUrl — URL к изображению для загрузки
iView — ссылка на виджет ImageView, которому будет назначено изображение после загрузки.
Оба параметра являются обязательными.

Результат:

Функция не возвращает ничего.

Краткое описание:

Функция создает поток для загрузки изображения. На время загрузки во входной ImageView устанавливается стандартное изображение. После завершения загрузки, изображение входного ImageView обновляется загруженным.

Несколько слов о потоке: в строке 46 происходит понижение приоритета потока. Это сделано для того, что бы данный поток не забирал ресурсы необходимые для корректной работы приложения.

Метод downloadImage():

public static Bitmap downloadImage( String iUrl);

Входные параметры:

iUrl — URL к изображению для загрузки

Результат:

Изображение загруженное из интернета, либо Null — если операция не была выполнена успешно.

Краткое описание:

В функции создается соединение с сервером, где находится изображение. Происходит получение входного потока, который далее передается в BitmapFactory для создания изображения.

Как использовать ImageManager:

Рассмотрим на примере к статье. В методе FetchImageAdapter.getView(), для подгрузки изображений в ImageView строки списка, используется следующая строка:
ImageManager.fetchImage(android.image, holder.ib_logo);
где android.image — URL к изображению, а holder.ib_logo — ImageView строки списка.

Заключение:

Данный механизм подходит для загрузки изображения из Интернета в параллельном потоке, для любого виджета ImageView Android. Т. е. данный механизм можно использовать не только для конкретно поставленной задачи.

Источник

Оцените статью