将Drawable或Bitmap设置为图标在Android中的通知中

Use*_*590 18 android android-notifications android-notification-bar

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

    Notification notification = new NotificationCompat.Builder(context)

    .setContentTitle(title)

    .setContentText(message)

    .setContentIntent(intent)

    .setSmallIcon(bitmap)

    .setWhen(when)

    .build(); 
Run Code Online (Sandbox Code Playgroud)

但是icon是一个Resources int值,所以当我使用它时会出错.任何帮助

编辑:

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

          Notification notification = new NotificationCompat.Builder(context)

        .setContentTitle(title)

        .setContentText(message)

        .setContentIntent(intent)

        .setSmallIcon(icon)

        .setLargeIcon(bitmap)

        .setWhen(when)

        .build();
Run Code Online (Sandbox Code Playgroud)

但它左侧有大图标,右侧有小图标.我不希望这样,为此我删除setSmallIcon行并运行我的代码,但它没有显示通知

Sid*_*ele 23

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

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

即使你是在转换Bitmap到一个Drawable这样的,例如:

Drawable d = new BitmapDrawable(getResources(), bmpFinal);
Run Code Online (Sandbox Code Playgroud)

它仍然会给你一个错误,因为你的应用程序包Drawable不存在这个错误.

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

builder.setSmallIcon(R.drawable.ic_launcher);
Run Code Online (Sandbox Code Playgroud)

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

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

  • `setLargeIcon(Bitmap)`对我来说不起作用. (7认同)

Rem*_*min 17

你可以尝试使用这种方法

 builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是回答OP问的问题. (9认同)

Luc*_*llo 12

关于这个问题有一些观点,主要与API 23+有关,如果你只对setSmallIcon感兴趣,请转到第2和第3个主题.

第1名:

您可以从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);
Run Code Online (Sandbox Code Playgroud)

第二名:

如果您需要在API中设置一个小于23的小图标,则需要设置资源ID R.drawable.your_resource.在NotificationCompat.Builder不允许使用可绘制或位图setSmallIcon().

第3名:

幸运的是,支持已经扩展为使用Notification.Builder在版本23+中Icon键入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);
Run Code Online (Sandbox Code Playgroud)


Nee*_*ngh 6

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

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



.setSmallIcon(getApplicationInfo().icon)
.setLargeIcon(bitmap)
Run Code Online (Sandbox Code Playgroud)