android - 如何使用 Glide 使用 AdaptiveBitmap 加载 IconCompat

标签 android android-notifications android-glide android-bubbles

如何利用 Glide 缓存加载通知图标?这些是 IconCompat用于 Person MessagingStyle 中的对象通知和Shortcuts .另外,Bubbles需要同时使用这两者。

我将 Glid 用作休闲:

private IconCompat loadIcon(String url) throws ExecutionException, InterruptedException {
    RequestOptions requestOptions = new RequestOptions().override(ADAPTIVE_BITMAP_SIZE);
    Bitmap bitmap = Glide.with(G.app).asBitmap().apply(requestOptions).load(url).submit().get();
    return IconCompat.createWithAdaptiveBitmap(bitmap);
}

我有几个关于这个解决方案的问题

  • ADAPTIVE_BITMAP_SIZE 的大小应该是多少?
  • 位图何时会被回收?
  • 如何处理加载位图时的错误?

最佳答案

为异步加载图标创建自定义 TargetWrapper。 使用 TargetWrapper 实例配置 Glide。

asyncLoadIcon("http://YOUR_URL.com"){
    val person = Person.Builder()
        .setName("John Doe")
        .setIcon(it)

    notificationManagerHelper.notify(
        person.build()
    )
}

异步加载位图然后包装到图标中的辅助函数

 private fun asyncLoadIcon(avatar: String?, block: (IconCompat?) -> Unit) {
        if (avatar.isNullOrEmpty())
            block(null)
        else {
            GlideHelper.createWithAdaptiveBitmap(requireContext(), avatar) { result ->
                if (result?.isSuccess() == true)
                    block(IconCompat.createWithAdaptiveBitmap(result.toData()))
                else block(null)
            }
        }
    }

这是 Glide 图像请求函数,通过回调检索位图。

fun createWithAdaptiveBitmap(
    context: Context,
    url: String,
    listener: ((Result<Bitmap>?) -> Unit)
) {
    val options = RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.DATA)
        .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
        .dontTransform()

    Glide.with(context)
        .asBitmap()
        .apply(options)
        .load(url)
        .into(CustomTargetWrapper(listener))
}

用于异步加载位图的 CustomTargetWrapper 类。

class CustomTargetWrapper(
    private val listener: ((Result<Bitmap>?) -> Unit)
) : CustomTarget<Bitmap>() {

    override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
        listener.invoke(Result.Success(resource))
    }

    override fun onLoadCleared(placeholder: Drawable?) {
        listener.invoke(null)
    }

    override fun onLoadFailed(errorDrawable: Drawable?) {
        super.onLoadFailed(errorDrawable)
        listener.invoke(Result.Error(IOException("Glide load failed")))
    }
}

关于android - 如何使用 Glide 使用 AdaptiveBitmap 加载 IconCompat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65025463/

相关文章:

android - 如何在对话框中设置 ListView 的 "onItemSelectedListener"。安卓

java - 简单的 Android SUM 和乘法应用程序在 AVD 上崩溃

android - 如何在 backpress 上销毁的通知(activity2)启动 Activity 后启动 MainActivity(activity1)

java - 在 Android 中清除 Glide 图像缓存

java - 无法通过一堆 URL(字符串数组)设置墙纸。如何解决这个问题?

java - Android 多次滑动 View

android - 防止用户关闭通知

azure - 如何排查 : Android client not receiving Azure Notifications Hub messages, 但确实收到从 Firebase 控制台发送的测试消息

java - RecyclerView 花费太长时间从用户存储中填充大量视频

android - 单击 ListView Item 的特定 View