Как сделать виджет на 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
для получения потока, если потребуется обработать изображение (например, изменить размер) перед отображением.
Кратко о ключевых шагах:
- Добавить в манифест
receiver
‑класс, указатьappwidget‑info
. - Создать XML‑описание виджета с размерами и макетом.
- В макете разместить
ImageView
с идентификатором. - Реализовать
Activity
для выбора изображения из галереи. - Сохранить полученный
Uri
в постоянное хранилище. - В
AppWidgetProvider
вonUpdate
загрузитьUri
и задать егоImageView
. - При изменении изображения отправлять широковещательный интент, вызывающий обновление всех виджетов.
- Обеспечить запрос необходимых разрешений и корректную работу с
ContentResolver
.
Следуя этим инструкциям, вы получите полностью функционирующий виджет, который динамически отображает любую фотографию, выбранную пользователем из галереи, и мгновенно реагирует на её замену.