【问题标题】:Can we use VectorDrawable or VectorXML as icons for push notifications in android?我们可以使用 VectorDrawable 或 VectorXML 作为 android 中推送通知的图标吗?
【发布时间】:2016-03-05 02:55:54
【问题描述】:

我正在使用 PNG 图像,但它的尺寸变得太大,所以我不得不在它的质量上妥协。所以我在想向量可能是另一种方式? 示例会很有帮助。

【问题讨论】:

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

标签: android xml push-notification android-vectordrawable


【解决方案1】:

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 上也有其他答案支持这个论点:

【讨论】:

    【解决方案2】:

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

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

    .setSmallIcon(R.drawable.my_vector)
    

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

    【讨论】:

    • 我认为这仅适用于 API 21+,因为我使用了上述内容,但对于棒棒糖之前的设备出现错误 like this。另请参阅this
    • @FarbodSalamat-Zadeh 是的,您需要使用条件检查用户的 SDK (if(Build.VERSION.SDK_INT
    【解决方案3】:

    2020 年更新

    是的,这绝对是可能的。但是让 Android Studio 负责图标的创建。否则,您将面临不支持旧 Android 版本的风险(查看其他答案)。

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

    1. 在 Android Studio 左侧的文件上右击
    2. 新建 > 图像资源
    3. 图标类型 > 通知图标

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

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

    【讨论】:

      【解决方案4】:

      对于版本

      如果你想直接将矢量drawable资源id传入setSmallIcon():没办法。

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            Wuthout矢量可绘制支持包,我没有遇到任何错误,但使用后,pre-lollipop设备在通知时无法访问矢量图标并抛出此错误:

            android.app.RemoteServiceException: 错误通知从 包 com.xxx.xxx:无法创建图标: StatusBarIcon(pkg=com.xxx.xxxuser=0 id=0x7f020082 级别=0 可见=true 数=0)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-10-10
              • 1970-01-01
              • 2019-02-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多