Можем ли мы использовать VectorDrawable или VectorXML в качестве значков для push-уведомлений в Android?

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

7 ответов

Решение

Можем ли мы использовать VectorDrawable или VectorXML в качестве значков для push-уведомлений?

Да, просто назовите вектор для рисования стандартным способом для уведомлений:

.setSmallIcon(R.drawable.my_vector)

Чтобы использовать прозрачность (значки уведомлений только белые и / или прозрачные), вам придется использовать альфа-каналы при настройке цветов в векторном XML, что означает #00000000 для прозрачного и #FFFFFFFF для белого.

VectorDrawables будут работать только в качестве значков уведомлений для версий выше (или равных) Android Lollipop - т.е. API 21.

Я знаю это, потому что я пытался использовать .setSmallIcon(R.drawable.my_vector) как показано в одном из других ответов здесь, и хотя это прекрасно работает для API 21 и выше, я получил следующую ошибку для версий до Lollipop:

android.app.RemoteServiceException: Плохое уведомление отправлено из пакета com.example.app: не удалось создать значок: StatusBarIcon(pkg=com.example.appuser=0 id=0x7f02005a level=0 visible=true num=0)

Есть и другие ответы о переполнении стека, поддерживающие этот аргумент:

ОБНОВЛЕНИЕ 2020

Да, это определенно возможно. Но пусть Android Studio позаботится о создании иконок. В противном случае вы рискуете не поддерживать более старые версии Android (проверьте другие ответы).

Итак, как создавать правильные файлы с помощью Android Studio:

  1. Щелкните правой кнопкой мыши файл в левой части Android Studio.
  2. New > Image Assets
  3. Тип значка> Значки уведомлений

  1. Выберите векторное изображение (например,.svg)

Студия Android создаст все необходимые файлы.

Для версии < 21,

Если вы хотите напрямую передать идентификатор векторного рисоваемого ресурса в setSmallIcon (): ни в коем случае.

Для setLargeIcon() косвенно да. использование

VectorDrawableCompat drawable = VectorDrawableCompat.create(context.getResources(), resource id, theme);

затем создайте растровое изображение из этого объекта и перейдите в setLargeIcon()

Вот что вы можете сделать с уведомлением Firebase

добавьте их в манифест:

          <meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_http" />


    <meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/notification_color" />
  1. замените "ic_http" на свой значок
  2. замените «notification_color» на желаемый цвет

Самая Импортная вещь!

  1. В вашей иконке весь путь должен быть векторным!
  2. Не должно быть фоновой области! (Это важно, иначе будет показана прямоугольная область желаемого цвета.

Если вы настаиваете на использовании Vector drawable, попробуйте преобразовать его в растровое изображение:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.my_vector_drawable);
                    mBuilder = new NotificationCompat.Builder(context)
                            .setLargeIcon(bitmap)
                            .setOngoing(!cancelable);

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        mBuilder.setSmallIcon(getNotificationIcon());
                    }

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

Проверьте это: Уведомление выдает ошибку при использовании векторных объектов рисования.

Wuthout vector drawable support package, я не обнаружил никаких ошибок, но после его использования устройства, предшествующие леденцу на палочке, не смогли получить доступ к значку вектора во время уведомления и выдавали эту ошибку:

android.app.RemoteServiceException: Плохое уведомление отправлено из пакета com.xxx.xxx: не удалось создать значок: StatusBarIcon(pkg=com.xxx.xxxuser=0 id=0x7f020082 level=0 visible=true num=0)

Другие вопросы по тегам