如何在安卓中将位图设置为通知图标

5

你好,我正在寻找一种方法来设置不在res目录中的位图。实际上,我从URL获取该图标,并希望将其设置在通知区域。

这里是我的做法,但它只能设置在res目录中的图标。

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.ic_stat_logo)
    .setContentTitle(Util.notificationTitle)
    .setStyle(new NotificationCompat.BigTextStyle()
    .bigText(notificationMessage))
    .setAutoCancel(true)
    .setDefaults(Notification.DEFAULT_SOUND)
    .setContentText(notificationMessage);

有什么办法可以从URL设置获取位图并将该图标设置为“通知”图标?

如果您将其获取并下载到本地空间,然后使用绝对路径引用它呢?那么它就被下载并且在某种程度上被缓存了。 - Fallenreaper
1
@Fallenreaper 但是这个方法 setSmallIcon 只接受方法参数中的 int 类型,而不接受任何路径。 - N Sharma
4个回答

9

这里已经有答案了:https://dev59.com/pWQo5IYBdhLWcg3wbe_r#16055373

总结:无法设置自定义小图标,但从API等级11开始,您可以在下载图片并将其转换为Bitmap后使用setLargeIcon()

[编辑] 还有另一种解决方案: 如果您创建了一个完全自定义的通知及其自己的视图,您可以在该视图中放置任何内容,包括下载的图像。


6
自 API 23,Android 引入了一种新的方法,可以使用从 URL 下载的位图来设置 setSmallIcon。
    notificationBuilder.setSmallIcon(Icon.createWithBitmap(yourDownloadedBitmap));

5
有没有好的方法可以将这个与NotificationCompat结合使用(意思是在Android 23及以上版本中使用图标,而在低于23的版本中则使用资源ID作为后备)? - ligi
4
这不起作用,setSmallIcon(int) 无法应用于 android.graphics.drawable.Icon。 - vinidog
我使用了IconCompat.createWithBitmap而不是Icon.createWithBitmap,因为其中一个setSmallIcon方法需要一个IconCompat对象。 - Juan P.

4

我认为您不能直接使用URL,但是您可以使用以下语句,但仅在使用大图标时才能使用。

此语句将URL转换为位图:

Bitmap bitmap = getBitmapFromURL("Your URL");


public Bitmap getBitmapFromURL(String strURL) {
    try {
        URL url = new URL(strURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

现在,在您的通知构建程序中,您可以使用以下代码:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
    .setLargeIcon(bitmap)
    .setContentTitle(Util.notificationTitle)
    .setStyle(new NotificationCompat.BigTextStyle()
    .bigText(notificationMessage))
    .setAutoCancel(true)
    .setDefaults(Notification.DEFAULT_SOUND)
    .setContentText(notificationMessage);

不要忘记在您的清单文件中添加权限声明:

不要忘记在您的清单文件中添加权限声明:

<uses-permission android:name="android.permission.INTERNET" />

1
请注意,setSmallIcon 只接受来自 res 的 int 类型参数,而不是任何位图。 - N Sharma
谢谢Williams,我已经在一个大图标中使用了它。 - EstherSalinas
3
问题是关于 setSmallIcon 而不是 setLargeIcon。 - vinidog
仅设置largeIcon是不够的。smallIcon是必需的,否则这段代码会导致应用程序崩溃。 - Alaa Eddine Cherbib

-2

设置自定义PNG图像到通知的简单方法是在app/src/main/res文件夹中创建一个drawable文件夹,然后将图像粘贴到该文件夹中,接着您可以像这样访问该图像:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.imagename);


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