Android 消息样式通知 - 从图像 URL 添加图标 - Person.Builder

问题描述 投票:0回答:2

我正在使用 Person 对象来构建 Gmail 等聊天应用程序通知。所以我创建了 person 对象。但我想从来自服务器的图像 URL 设置图标,而不是来自可绘制资源。我正在使用 Coil 库来加载图像。下面的代码工作正常,

默认情况下,android 会生成图标,并将第一个字母传递给标题。 那么,我如何将来自服务器的图像显示为图标中的 URL,并具有内存和资源使用的最佳实践。下面是我的 Person 对象。 这是Person的官方链接。 这就是我提到的通知消息风格教程

    val senderPerson: Person = Person.Builder().also {person->
        person.setKey(message.getSenderKey(prefs))
        person.setName(message.getNotificationTitle())
        person.setImportant(true)
//****HERE I WANT TO SET IMAGE FROM URL******
        //    person.setIcon(IconCompat.createWithResource(this, R.drawable.placeholder_transaparent))
    }.build()
android kotlin notifications kotlin-coroutines coil
2个回答
1
投票

您可以使用 Coil Request 异步加载图像 URL,并在闭包中返回获取的图标。

Coil 返回一个可绘制对象,您可以使用

Drawable
通过位图从
IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)
获取图标:

private fun asyncLoadIcon(imageUrl: String?, setIcon: (IconCompat?) -> Unit) {
    if (imageUrl.isNullOrEmpty())
        setIcon(null)
    else {
        // using COIL to load the image
        val request = ImageRequest.Builder(this)
            .data(imageUrl)
            .target { drawable ->
                setIcon(IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)) //  // Return the fetched icon from the URL
            }
            .listener(object : ImageRequest.Listener { // Return null icon if the URL is wrong
                override fun onError(request: ImageRequest, result: ErrorResult) {
                    setIcon(null)
                }
            })
            .build()
        imageLoader.enqueue(request)
    }
}

如果 URL 错误或为空/空,此代码将返回空图标。

然后使用该函数构建通知消息:

asyncLoadIcon("https://my_icon_url.png") { // set the icon url

    val person = Person.Builder().apply {
        setName("John Doe")
        setIcon(it)
    }.build()
    
    // Build the notification with the person
    .....
    
}

对于某些增强功能,您可以启用缓存并禁用硬件位图;但我确实推荐其他库,例如 Glide 和 Picasso。

.memoryCachePolicy(CachePolicy.ENABLED)
.diskCachePolicy(CachePolicy.ENABLED)
.allowHardware(false) // Disable hardware bitmaps


0
投票

这是使用 Kotlin 协程的另一种方法。我们可以将 Coil 的异步调用转换为可挂起的函数。

val person = Person.Builder().apply {
    setName(name)
    getPersonIcon(imageUrl)?.let { setIcon(it) }
}.build()
private suspend fun getPersonIcon(
    imageUrl: String
): IconCompat? = suspendCoroutine { continuation ->
    val request = ImageRequest.Builder(context)
        .data(imageUrl)
        .target { drawable ->
            continuation.resume(
                IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)
            )
        }
        .listener(object : ImageRequest.Listener {
            override fun onError(request: ImageRequest, result: ErrorResult) {
                continuation.resume(null)
            }
        })
        .build()
    Coil.imageLoader(context).enqueue(request)
}
© www.soinside.com 2019 - 2024. All rights reserved.