我们可以使用VectorDrawable或VectorXML作为Android中推送通知的图标吗?

时间:2015-12-01 08:45:22

标签: android xml push-notification android-vectordrawable

我正在使用PNG图像,但它的尺寸太大,所以我不得不妥协它的质量。所以我认为矢量可能是另一种方式? 示例将是一个很好的帮助。

7 个答案:

答案 0 :(得分:19)

VectorDrawables仅作为高于(或等于)Android Lollipop版本的通知图标 - 即API 21。

我知道这是因为我确实尝试使用.setSmallIcon(R.drawable.my_vector),如此处的其中一个答案中所示,虽然这对于API 21及更高版本的效果非常好,但我在Lollipop之前的版本中出现以下错误:< / p>

  

android.app.RemoteServiceException:从com.example.app包发布错误通知:无法创建图标:StatusBarIcon(pkg = com.example.appuser = 0 id = 0x7f02005a level = 0 visible = true num = 0)

Stack Overflow上还有其他答案支持这个论点:

答案 1 :(得分:10)

  

我们可以使用VectorDrawable或VectorXML作为推送通知的图标吗?

是的,只需将矢量d​​rawable称为通知的标准方式:

<div ui-grid="taskCtrl.gridOptions" ui-grid-selection ui-grid-auto-resize></div>

为了使用透明度(通知图标只有白色和/或透明),在设置矢量XML中的颜色时必须使用alpha通道,这意味着#00000000表示透明,#FFFFFFF表示白色。 / p>

答案 2 :(得分:2)

UPDATE 2020

是的,绝对有可能。但是让Android Studio负责图标的创建。否则,您将有可能不支持较旧的Android版本(请检查其他答案)。

因此,如何使用Android Studio创建正确的文件:

  1. 右键单击Android Studio左侧的文件
  2. 新>图片资产 enter image description here
  3. 图标类型>通知图标

enter image description here

  1. 选择矢量图像(例如.svg)

Android Studio将创建所需的所有正确文件。

答案 3 :(得分:1)

您可以使用 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. 不能有背景区域! (这很重要,否则它会用您想要的颜色显示矩形区域

答案 4 :(得分:0)

如果您使用矢量绘图支持包,可能不应在通知中使用VectorDrawable图标 - 您可能会在棒棒糖前设备上遇到错误。

看看这个:Notification throws error when using vector drawables

Wuthout矢量绘图支持包,我没有遇到任何错误但是在使用它之后,棒棒糖前设备在通知时无法访问矢量图标并抛出此错误:

  

android.app.RemoteServiceException:发布错误通知   package com.xxx.xxx:无法创建图标:   StatusBarIcon(pkg = com.xxx.xxxuser = 0 id = 0x7f020082 level = 0 visible = true   NUM = 0)

答案 5 :(得分:0)

对于版本&lt; 21,

如果你想直接将vector drawable资源id传递给 setSmallIcon():没办法。

对于 setLargeIcon()间接,是的。使用

int itr=0;
for(Iterator<Map.Entry<String, Boolean>> entries = map.entrySet().iterator; entries.hasNext(); ) {
    itr++;
    Map.Entry<String, Boolean> entry = entries.next();
    if(entry.getValue()) {
       name = entry.getKey();
       index = itr;
    }
}

然后从此drawable创建Bitmap并传入 setLargeIcon()

答案 6 :(得分:0)

如果您坚持使用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());
                    }