Можем ли мы использовать VectorDrawable или VectorXML в качестве значков для push-уведомлений в android?
Я использую изображение PNG, но его размер становится слишком большим, поэтому я должен идти на компромисс с его качеством. Так что я думал, что векторы могут быть другим способом? Пример будет большой помощью.
Ответы
Ответ 1
Можно ли использовать VectorDrawable или VectorXML в качестве значков для push-уведомлений?
Да, просто назовите вектор, который можно использовать стандартным способом для уведомлений:
.setSmallIcon(R.drawable.my_vector)
Чтобы использовать прозрачность (значки уведомлений только белые и/или прозрачные), вам придется использовать альфа-каналы при настройке цветов в векторном XML, что означает # 00000000 для прозрачного и #FFFFFFFF для белого.
Ответ 2
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)
Есть также другие ответы на Stack Overflow, поддерживающие этот аргумент:
Ответ 3
Вероятно, вы не должны использовать значки VectorDrawable в уведомлениях, если вы используете пакет поддержки векторной переносимости - вы можете столкнуться с ошибками на устройствах с предварительным леоптипом.
Проверьте это: уведомление выдает ошибку при использовании векторных чертежей
Wuthout векторный пакет поддержки, я не сталкивался с какими-либо ошибками, но после его использования устройства pre-lollipop не смогли получить доступ к значку вектора во время уведомления и выбросили эту ошибку:
android.app.RemoteServiceException: Неверное уведомление, отправленное из пакета com.xxx.xxx: Не удалось создать значок: StatusBarIcon (pkg = com.xxx.xxxuser = 0 id = 0x7f020082 level = 0 visible = true num = 0)
Ответ 4
Для версии <21,
Если вы хотите напрямую передать векторный идентификатор ресурса в setSmallIcon(): нет способа.
Для setLargeIcon() косвенно, да. использование
VectorDrawableCompat drawable = VectorDrawableCompat.create(context.getResources(), resource id, theme);
затем создайте Bitmap из этого drawable и перейдите в setLargeIcon()
Ответ 5
Если вы настаиваете на использовании векторного рисования, попробуйте преобразовать его в растровое изображение:
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());
}