使用矢量图标时,通知会抛出错误

28

当我使用矢量图标作为通知的小图标时,出现以下异常:

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

这是我的代码:

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);

我的 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:当我使用png或jpg图像可绘制对象时,代码运行良好,但使用矢量可绘制对象时就会出现问题。

我已经搜索了整整一天,但找不到适合我的解决方案。有什么想法吗?


你正在测试哪个版本的Android?通常情况下,你正在使用支持库后移,但我认为这对于“通知”不起作用,因为平台正在尝试使用资源。 - CommonsWare
我正在API 19上进行测试。我将检查问题是否存在于其他任何版本中。 - ShahiM
我已经加入了SDK版本检查,并避免在API版本21 Kitkat之前的版本中调用setSmallIcon。 - LPVOID
1个回答

43

您正在使用矢量图支持包。虽然这很好,但这仅适用于您的应用程序。在API级别21之前,平台不知道如何使用矢量可绘制物,并且对于Notification,平台是呈现资源的一个。

您可以将矢量可绘制物自己呈现到由Bitmap支持的Canvas中,然后在Notification中使用该Bitmap。或者,您可以在一般情况下使用矢量后援库,但对于您手头的一些Notification图标,请为它们生成PNG文件并在旧设备上使用它们。将相应的矢量可绘制物放入res/drawable-anydpi-v21/中,新设备将使用矢量可绘制物,而旧设备则会回退到PNGs中。


还有一件事。小图标的首选dp大小是多少? - ShahiM
1
@ShahiM: 我认为是 24dp - CommonsWare
为什么在旧设备上已经有PNG格式的情况下,还要再次使用向量呢?! - David
启动器图标也是一样的吗? - Seshu Vinay
1
@SeshuVinay:是的,你不能假设主屏幕实现知道如何使用矢量可绘制图形。我尝试过这个,遇到了各种问题。 - CommonsWare
非常棒的解决方案。我使用硬编码的Java来使用midmap而不是XML(向量)图标用于API <21,但我更喜欢您的解决方案!谢谢! - hb0

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