我们能在Android推送通知中使用VectorDrawable或VectorXML作为图标吗?

31

我正在使用PNG图像,但它的大小变得太大了,所以我不得不在质量上做出妥协。因此,我想向量可能是另一种解决方法?举个例子会很有帮助。


1
如果你的PNG图片很大,将其放入drawable-xxhdpi资源文件夹中,然后使用它! - Madhur
所以问题是你的 PNG 图像大小对于图标来说太大了?你可以为不同的屏幕调整大小。你可以使用 http://romannurik.github.io/AndroidAssetStudio/。它可以帮助你创建不同尺寸和密度的图标。 - Mohamad Damba Putrabangga
1
我已经重新调整大小并将其包含在drawable-xxhdpi中,一直在使用,但由于Lollipop更新,我不得不创建透明图像并将其与背景颜色一起使用,这进一步降低了其质量。那么有没有办法可以创建彩色的drawablevector并将其用作图标? - Rajan Kadeval
是用于“setSmallIcon(int)”,“setLargeIcon(Bitmap)”还是“NotificationCompat.BigPictureStyle.bigPicture(Bitmap)”?可以使用DrawingCache将VectorDrawable光栅化为位图。...但这会让您回到大小问题,只是从构建时间移动到运行时间。如果这是您的目标,它仍将降低APK大小。您可以在“setSmallIcon(int)”中使用实际的VectorDrawable,但这仅适用于Lollipop设备或更高版本(我在Galaxy S4上进行了测试),目前缺少约60%的市场:http://developer.android.com/about/dashboards/index.html - John
7个回答

29

仅当Android Lollipop及以上版本(即API 21或更高版本)时,矢量图标才能作为通知图标正常工作。

我知道这一点是因为我尝试过像其他答案中所示使用.setSmallIcon(R.drawable.my_vector),虽然它对API 21及以上版本完美地工作,但在Lollipop版本之前的版本中,我会得到以下错误:

android.app.RemoteServiceException: Bad notification posted from package com.example.app: Couldn't create icon: StatusBarIcon(pkg=com.example.appuser=0 id=0x7f02005a level=0 visible=true num=0 )

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


19

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

可以,只需像标准通知一样调用向量可绘制对象即可:

.setSmallIcon(R.drawable.my_vector)
为了使用透明度(通知图标仅为白色和/或透明),您需要在矢量XML中设置颜色时使用alpha通道,意思是#00000000代表透明,#FFFFFFFF代表白色。

18
我认为这只适用于API 21以上版本,因为我尝试使用上述方法时,对于Android 5.0以下的设备会出现类似于这样的错误,请参考此处 - Farbod Salamat-Zadeh
1
@FarbodSalamat-Zadeh 是的,您需要使用条件检查用户的SDK(如果(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))。 - Yoann Hercouet
是的,但是请参考下面的另一个答案(https://dev59.com/61sX5IYBdhLWcg3wRdt_#62876054)。 - SMBiggs

6

更新2020年:

是的,这绝对是可能的。但是让Android Studio来处理图标创建工作。否则,您将有可能不支持较旧的Android版本(请查看其他答案)。

那么如何使用Android Studio创建正确的文件:

  1. 右键单击Android Studio左侧的文件
  2. 新建 > 图像资产 输入图像描述
  3. 图标类型 > 通知图标

输入图像描述

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

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


3

在21版本以下,如果想要直接传入矢量图标资源ID到setSmallIcon()中:不可能。

但是对于setLargeIcon()间接传入,可以使用:

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

然后从这个drawable创建Bitmap并将其传递到setLargeIcon()


1
以下是Firebase Notification的用途:

在清单文件中添加以下内容:

    <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. 不能有背景区域!(这很重要,否则会显示一个带有你所需颜色的矩形区域)

1
如果您坚持使用矢量图,请尝试将其转换为位图:
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());
                    }

0

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

请查看此链接:使用矢量可绘制对象时通知抛出错误

在没有矢量图支持包的情况下,我没有遇到任何错误,但是在使用它之后,早期的设备无法在通知时访问矢量图标,并抛出以下错误:

android.app.RemoteServiceException: Bad notification posted from package com.xxx.xxx: Couldn't create icon: StatusBarIcon(pkg=com.xxx.xxxuser=0 id=0x7f020082 level=0 visible=true num=0)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接