包管理器不重新刷新应用程序的图标



我正在尝试获得应用程序通知的图标。监听器工作得很好,但对于我尝试过的大多数应用程序(电报、信号、安卓消息……)我似乎看不清应用程序的图标。
下面是我尝试获取图标的代码:

private fun getIcon(notification: StatusBarNotification, context: Context): Bitmap {
val packageManager = context.packageManager
return try {
Bitmap.createBitmap(drawableToBitmap(packageManager.getApplicationIcon(notification.packageName)))
} catch (exception: PackageManager.NameNotFoundException) {
return Bitmap.createBitmap(10, 10, Bitmap.Config.ALPHA_8)
}
}
private fun drawableToBitmap(drawable: Drawable): Bitmap {
if (drawable is BitmapDrawable) {
if (drawable.bitmap != null) {
return drawable.bitmap
}
}
val bitmap: Bitmap = if (drawable.intrinsicWidth <= 0 || drawable.intrinsicHeight <= 0) {
Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
} else {
Bitmap.createBitmap(
drawable.intrinsicWidth,
drawable.intrinsicHeight,
Bitmap.Config.ARGB_8888
)
}
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
return bitmap
}

要获得图标,你应该同时使用class &包名,而不是只使用包名。如果应用程序支持更改图标或有多个启动器活动,这工作得更好。

fun getIcon(context: Context, packageName: String, className: String): Drawable? {
var drawable: Drawable? = null
try {
val intent = Intent(Intent.ACTION_MAIN)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
intent.setClassName(packageName, className)
drawable = context.packageManager.getActivityIcon(intent)
} catch (e: Exception) {
try {
drawable = context.packageManager.getApplicationIcon(packageName)
} catch (e: Exception) {
e.printStackTrace()
}
}
return drawable
}

此函数返回可绘制的图标,如果失败则返回null。它首先尝试使用包名和类名来获取图标,但如果失败,则只使用包名。如果不想同时使用类名,可以只使用包名。

如果每次它仍然只是捕获异常,而你知道应用程序已安装,你可能缺乏一些权限。您也可以再次尝试使用targetSdkVersion 29而不是targetSdkVersion 30,因为30为这种功能增加了一些限制,但我不确定这些是否也会影响获得图标。

最新更新