Можем ли мы использовать 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:
- Щелкните правой кнопкой мыши файл в левой части Android Studio.
- New > Image Assets
- Тип значка> Значки уведомлений
- Выберите векторное изображение (например,.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" />
- замените "ic_http" на свой значок
- замените «notification_color» на желаемый цвет
Самая Импортная вещь!
- В вашей иконке весь путь должен быть векторным!
- Не должно быть фоновой области! (Это важно, иначе будет показана прямоугольная область желаемого цвета.
Если вы настаиваете на использовании 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)