使用矢量drawable时,通知会引发错误

时间:2021-08-01 04:17:25

I get the following exception when I use a vector drawable to set the small icon for a notification :

当我使用vector drawable设置通知的小图标时,我得到以下异常:

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

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

Here is my code :

这是我的代码:

mNotificationBuilder = new android.support.v4.app.NotificationCompat.Builder(this)
                .setDefaults(android.support.v4.app.NotificationCompat.DEFAULT_LIGHTS)
                .setSound(null)
                .setSmallIcon(R.drawable.logo_white)
                .setColor(getResources().getColor(R.color.colorPrimary))
                .setCategory(android.support.v4.app.NotificationCompat.CATEGORY_PROGRESS)
                .setContentTitle("Trip in Progress...")
                .setAutoCancel(false)
                .setProgress(0, 0, progress)
                .setOngoing(true)
                .setPriority(android.support.v4.app.NotificationCompat.PRIORITY_MAX)
                .setOnlyAlertOnce(true)
                .setContentIntent(pendingIntent);

mNotificationBuilder.setContentText(body);

mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification note = mNotificationBuilder.build();

mNotificationManager.notify(Constants.NOTIFICATION_ID_Dash, note);

and my build.gradle (only relevant parts) :

和我的build.gradle(只有相关部分):

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.qbes.xxx"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 720
        versionName "0.7.20"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
}

PS : The code works fine when I use a png or jpg image drawable, but breaks when using a vector drawable.

PS:当我使用png或jpg图像绘制时,代码工作正常,但在使用矢量drawable时中断。

I have been searching for a whole day but could not find anything that worked for me. Any Ideas.

我一直在寻找一整天但找不到任何对我有用的东西。有任何想法吗。

1 个解决方案

#1


32  

You are using the vector drawable support package. That's fine, but that only works in your app. The platform does not know how to use vector drawables prior to API Level 21, and for a Notification, the platform is the one rendering the resource.

您正在使用矢量drawable支持包。这很好,但只适用于您的应用。平台不知道如何在API Level 21之前使用矢量drawable,而对于Notification,平台是渲染资源的平台。

You could render the vector drawable yourself to a Canvas backed by a Bitmap, then use that Bitmap in the Notification. Or, you could use the vector backport library in general, but for your handful of Notification icons, generate PNG files for them and use them on the older devices. Put the corresponding vector drawables in res/drawable-anydpi-v21/, and the newer devices will use the vector drawables while older devices fall back to the PNGs.

您可以将矢量绘制为自己渲染到由Bitmap支持的Canvas,然后在Notification中使用该Bitmap。或者,您可以使用矢量backport库,但是对于您的少数通知图标,为它们生成PNG文件并在旧设备上使用它们。将相应的矢量drawable放在res / drawable-anydpi-v21 /中,较新的设备将使用矢量drawables,而较旧的设备将回退到PNG。

#1


32  

You are using the vector drawable support package. That's fine, but that only works in your app. The platform does not know how to use vector drawables prior to API Level 21, and for a Notification, the platform is the one rendering the resource.

您正在使用矢量drawable支持包。这很好,但只适用于您的应用。平台不知道如何在API Level 21之前使用矢量drawable,而对于Notification,平台是渲染资源的平台。

You could render the vector drawable yourself to a Canvas backed by a Bitmap, then use that Bitmap in the Notification. Or, you could use the vector backport library in general, but for your handful of Notification icons, generate PNG files for them and use them on the older devices. Put the corresponding vector drawables in res/drawable-anydpi-v21/, and the newer devices will use the vector drawables while older devices fall back to the PNGs.

您可以将矢量绘制为自己渲染到由Bitmap支持的Canvas,然后在Notification中使用该Bitmap。或者,您可以使用矢量backport库,但是对于您的少数通知图标,为它们生成PNG文件并在旧设备上使用它们。将相应的矢量drawable放在res / drawable-anydpi-v21 /中,较新的设备将使用矢量drawables,而较旧的设备将回退到PNG。