如何在 Jetpack Compose 中显示已安装的应用程序图标

How to display installed app icon in jetpack compose

在 Jetpack Compose 中,您可以像这样使用 Image 可组合项轻松显示可绘制对象:

Image(painter = painterResource(id = R.drawable.my_drawable))

我正在构建一个需要列出设备上所有应用程序的应用程序,并且我需要显示它们的图标。我设法使用 PackageManager class:

获取图标
val packageManager = context.packageManager
val installedPackages = packageManager.getInstalledPackages(0)
val packageInfo = installedPackages[0]
val iconId: Int = packageInfo.applicationInfo.icon

然后:

Image(painter = painterResource(id = iconId))

但是应用程序每次都崩溃。不知道问题出在哪里?任何想法?谢谢

android.content.res.Resources$NotFoundException: Resource ID #0x7f030001

出于某种原因 icon 可能包含指向不存在的可绘制对象的标识符。

获取应用程序图标使用方法loadIcon:

val icon: Drawable = applicationInfo.loadIcon(packageManager)

或来自 PackageManager 的方法 getApplicationIcon

val icon: Drawable = packageManager.getApplicationIcon(applicationInfo)

然后,使用AndroidDrawablePainter将Drawable转换为Painter:

Image(painter = AndroidDrawablePainter(icon))

DrawablePainter is available in accompanist图书馆:

Image(painter = DrawablePainter(icon))

如果您使用 Coil libraryrememberImagePainter 将接受 Any? 作为其 data 参数,允许您使用返回的 Drawable来自 PackageManager,像这样:

  Image(
    painter = rememberImagePainter(
      data = LocalContext.current.packageManager.getApplicationIcon("com.package.example")
    )
  )