【问题标题】:How to display installed app icon in jetpack compose如何在jetpack compose中显示已安装的应用程序图标
【发布时间】:2022-02-08 23:59:50
【问题描述】:

在 jetpack compose 中,您可以像这样使用 Image composable 轻松显示可绘制对象:

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

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

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

【问题讨论】:

  • 请提供您崩溃的堆栈跟踪以及您如何使用 PackageManager 的代码。
  • 我修改了帖子。谢谢

标签: android android-jetpack android-jetpack-compose


【解决方案1】:

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

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

val icon: Drawable = applicationInfo.loadIcon(packageManager)

或来自 PackageManager 的方法 getApplicationIcon:

val icon: Drawable = packageManager.getApplicationIcon(applicationInfo)

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

Image(painter = AndroidDrawablePainter(icon))

或者DrawablePainter 在accompanist 库中可用:

Image(painter = DrawablePainter(icon))

【讨论】:

  • 但是loadIcon()' returns a Drawable and painterResource()`需要drawable的id
  • 添加对accompanist-imageloading-core 的依赖或将AndroidDrawablePainter.kt 复制到您的项目中,然后您可以将Drawable 转换为Painter。我已经更新了答案。
  • 我将accompanist 库依赖项添加到我的项目中,但我得到了Unresolved reference: AndroidDrawablePainter。谢谢你
  • 试试 DrawablePainter 而不是 AndroidDrawablePainter
【解决方案2】:

如果您使用Coil library,rememberImagePainter 将接受Any? 作为其data 参数,允许您使用从PackageManager 返回的Drawable,如下所示:

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

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2020-03-13
    相关资源
    最近更新 更多