Как сделать виджет на Android с картинкой из галереи?

Как сделать виджет на Android с картинкой из галереи? - коротко

Создайте AppWidgetProvider, в его layout разместите ImageView, запросите READ_EXTERNAL_STORAGE, а в onUpdate загрузите выбранную из галереи картинку через ContentResolver и обновите RemoteViews.

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

Создайте новое приложение и добавьте в него файл‑манифест, где объявите виджет. В разделе <receiver> укажите свой AppWidgetProvider, задайте android:exported="true" и привяжите к нему мета‑данные appwidget‑info. Затем создайте XML‑файл описания виджета (res/xml/widget_info.xml), где укажите размеры, обновление и начальный макет.

Макет виджета (res/layout/widget_layout.xml) должен содержать ImageView с фиксированным id, например @+id/widget_image. По умолчанию можно задать плейсхолдер‑картинку, чтобы виджет выглядел даже без пользовательского выбора.

Для выбора изображения из галерии понадобится отдельная Activity. В ней вызывайте Intent.ACTION_PICK с типом image/*. После того как пользователь выбрал файл, получите Uri в методе onActivityResult. Сохраните полученный Uri в SharedPreferences или в базе SQLite, чтобы иметь к нему доступ при обновлении виджета.

Обновление виджета происходит в AppWidgetProvider. Переопределите метод onUpdate, создайте RemoteViews, укажите в нём setImageViewUri(R.id.widget_image, selectedUri). Затем вызовите AppWidgetManager.updateAppWidget(widgetId, remoteViews). Чтобы обновлять изображение без перезапуска виджета, отправляйте широковещательный интент с действием, которое ваш провайдер будет принимать в onReceive. В обработчике получите widgetId и выполните ту же последовательность обновления RemoteViews.

Если пользователь меняет картинку, нужно вызвать AppWidgetManager.notifyAppWidgetViewDataChanged либо напрямую вызвать updateAppWidget для всех активных экземпляров виджета. Для этого храните список widgetId в SharedPreferences или получайте их через AppWidgetManager.getAppWidgetIds.

Не забудьте запросить у пользователя разрешения на чтение внешнего хранилища (READ_EXTERNAL_STORAGE), если ваша целевая SDK‑версия требует явного разрешения. При работе с Uri используйте ContentResolver для получения потока, если потребуется обработать изображение (например, изменить размер) перед отображением.

Кратко о ключевых шагах:

  1. Добавить в манифест receiver‑класс, указать appwidget‑info.
  2. Создать XML‑описание виджета с размерами и макетом.
  3. В макете разместить ImageView с идентификатором.
  4. Реализовать Activity для выбора изображения из галереи.
  5. Сохранить полученный Uri в постоянное хранилище.
  6. В AppWidgetProvider в onUpdate загрузить Uri и задать его ImageView.
  7. При изменении изображения отправлять широковещательный интент, вызывающий обновление всех виджетов.
  8. Обеспечить запрос необходимых разрешений и корректную работу с ContentResolver.

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