19

我从服务器下载图像作为位图并将其转换为可绘制现在我想将此可绘制用作通知图标。但我无法做到这一点。这是我的代码:

    Notification notification = new NotificationCompat.Builder(context)

    .setContentTitle(title)

    .setContentText(message)

    .setContentIntent(intent)

    .setSmallIcon(bitmap)

    .setWhen(when)

    .build(); 

但图标是资源 int 值,所以当我使用它时它会出错。任何帮助

编辑:

现在我更新我的代码,现在我正在这样做:

          Notification notification = new NotificationCompat.Builder(context)

        .setContentTitle(title)

        .setContentText(message)

        .setContentIntent(intent)

        .setSmallIcon(icon)

        .setLargeIcon(bitmap)

        .setWhen(when)

        .build();

但它在左侧给出大图标,在右侧给出小图标。我不想要这个所以为此我删除了 setSmallIcon 行并运行我的代码,但它没有向我显示通知

4

4 回答 4

28

如果您阅读特定于您的开发人员文档,Notification.Builder您会看到setSmallIcon(int icon)需要在可绘制应用程序包中使用 A 资源 ID

下载图像,转换为位图,然后将其设置setSmallIcon()为 仍然会给您一个错误。

即使您要将 转换为Bitmap这样Drawable的,例如:

Drawable d = new BitmapDrawable(getResources(), bmpFinal);

它仍然会给您一个错误,因为您的应用程序包Drawable中不存在该错误。

唯一可能的解决方案是使用Drawable您存在的资源package并将其设置为setSmallIcon()方法。典型用法:

builder.setSmallIcon(R.drawable.ic_launcher);

或者,setLargeIcon (Bitmap icon)需要一个 Bitmap 实例。无需对您当前的代码进行任何额外的更改(因为您已经有一个Bitmap),如果它符合您的要求,您可以按原样使用它。

如果没有,您几乎必须使用其中一个文件夹Drawable中已经存在的资源。drawable

于 2013-04-17T08:38:08.030 回答
20

您可以尝试使用此方法

 builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

http://javatechig.com/android/android-notification-example-using-notificationcompat

于 2015-09-27T23:03:14.167 回答
13

这个问题有几点,主要和API 23+有关,如果你只对setSmallIcon感兴趣,请去第二和第三主题。

第一个:

您可以从 Drawable(而不是 Resource id)设置 LargeIcon,如下所示

Drawable drawable= ContextCompat.getDrawable(this,R.drawable.your_drawable);

            Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(context)
                            .setLargeIcon(bitmap)
                            .setContentTitle("hahah")
                            .setContentText("Tap to stop")
                            .setOngoing(true);

第二:

如果需要在 API 中设置 23 以下的小图标,则需要设置资源 id,如R.drawable.your_resource. NotificationCompat.Builder不允许您在setSmallIcon().

第三:

幸运的是,使用 Notification.Builder 已将支持扩展到Icon23+setSmallIcon()版本,如下所示:

 Drawable drawable = ContextCompat.getDrawable(this,R.drawable.your_drawable);

            Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

            Notification.Builder mBuilder =
                    new Notification.Builder(context)
                            .setSmallIcon(Icon.createWithBitmap(bitmap))
                            .setLargeIcon(bitmap)
                            .setContentTitle("hahah")
                            .setContentText("Tap to stop")
                            .setOngoing(true);
于 2016-07-29T10:40:38.097 回答
4

更好的选择获取应用程序图标

 Drawable drawable=getApplicationInfo().loadIcon(getPackageManager());
 Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();



.setSmallIcon(getApplicationInfo().icon)
.setLargeIcon(bitmap)
于 2017-07-27T06:23:00.170 回答