Можем ли мы использовать 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());
                    }