Обои изменились, приемник вещания андроид

О приложении - я делаю фон своего приложения размытыми обоями. Легко получить обои как доступные для рисования, используя метод getWallpaper() в действии. Затем я конвертирую drawable в растровое изображение и использую алгоритм размытия для размытия растрового изображения, а затем устанавливаю его в качестве фонового изображения. Весь этот процесс занимает некоторое время от 1 до 5 секунд. Поэтому я решил поместить размытые обои на SD-карту, поэтому мне нужно просто получить это изображение с SD-карты, тогда это не займет так много времени. Поэтому каждый раз, когда пользователь меняет обои, мне нужно сделать эти обои размытыми и сохранить их на SD-карту. Для этого мне нужен широковещательный приемник ACTION_WALLPAPER_CHANGED.

Проблема: ACTION_WALLPAPER_CHANGED фильтр намерений работает нормально до API 16, но из API 16 он устарел и не транслирует действие смены обоев.

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


person Sunny    schedule 09.11.2013    source источник
comment
Как насчет другого подхода (не уверен, что это сработает): как указано в документах, используйте флаг WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, чтобы показать обои за пользовательским интерфейсом вашей активности. Запустите процесс размытия растрового изображения, сгенерированного с помощью getWallpaper(). Поскольку размытие растрового изображения — это многоэтапный процесс, вы можете использовать 5-секундную задержку в своих интересах.... (продолжение).   -  person Vikram    schedule 16.11.2013
comment
(...) Скажем, вы проходите 10 этапов, чтобы создать размытое растровое изображение. На каждом этапе (каждые ~ 0,5 секунды) используйте полученное растровое изображение для установки фона: getWindow().setBackgroundDrawable(new BitmapDrawable(getResources(), processedBitmap)). Это должно дать вам (гладкий?) эффект размытия. Излишне говорить, что сокращение 5 секунд до чего-то менее заметного поможет.   -  person Vikram    schedule 16.11.2013
comment
Другой способ: когда ваше приложение запускается (в первый раз), извлеките растровое изображение с помощью getWallpaper(), размойте его и сохраните оригинал и размытую копию на SD-карту. При последующих запусках извлекайте растровое изображение, используя getWallpaper(), и сравнивайте его с оригиналом, который вы сохранили при последнем запуске, используя: bitmapFromGetWallpaper.sameAs(originalFromSDCard). Если они совпадают, используйте размытую копию с SD-карты. В противном случае размойте bitmapFromGetWallpaper и обновите оригинал и размытую копию на SD-карте. Теперь задержка должна быть только тогда, когда пользователь меняет обои: так же, как до устаревания.   -  person Vikram    schedule 16.11.2013
comment
Привет спасибо! @ user2558882 Я воспользовался вашим вторым подходом. а также Если API №16, я также использовал широковещательный приемник.   -  person Sunny    schedule 16.11.2013


Ответы (1)


Поскольку вы больше не будете получать трансляцию, не будет ли лучшим направлением для вас попытаться улучшить производительность вашего метода размытия и сделать это на лету без хранения на SD-карте?

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

Возможно, посмотрите здесь (если вы еще этого не сделали) о быстром размытии изображения на Android:

Быстрое размытие растрового изображения для Android SDK

person bgse    schedule 15.11.2013
comment
Спасибо за совет! Я уже использую быстрое размытие. Это также занимает несколько раз около 1-5 секунд в зависимости от изображения. Я использовал второй подход в комментариях выше. - person Sunny; 16.11.2013