Android PackageManager不返回应用程序';s图标
我正在尝试获取应用程序通知的图标。监听器工作得很好,但对于我尝试过的大多数应用程序(电报、信号、android消息…),我似乎无法获取应用程序的图标。Android PackageManager不返回应用程序';s图标,android,kotlin,Android,Kotlin,我正在尝试获取应用程序通知的图标。监听器工作得很好,但对于我尝试过的大多数应用程序(电报、信号、android消息…),我似乎无法获取应用程序的图标。 以下是我尝试获取图标的代码: private fun getIcon(通知:StatusBarNotification,上下文:context):位图{ val packageManager=context.packageManager 回击{ createBitmap(drawableToBitmap(packageManager.GetApp
以下是我尝试获取图标的代码:
private fun getIcon(通知:StatusBarNotification,上下文:context):位图{
val packageManager=context.packageManager
回击{
createBitmap(drawableToBitmap(packageManager.GetApplicationName(notification.packageName)))
}捕获(异常:PackageManager.NameNotFoundException){
返回Bitmap.createBitmap(10,10,Bitmap.Config.ALPHA_8)
}
}
私人趣味drawableToBitmap(drawable:drawable):位图{
if(可绘制为位图可绘制){
if(drawable.bitmap!=null){
返回可绘制位图
}
}
val bitmap:bitmap=if(drawable.intrinsicWidth要获取图标,您应该同时使用类名和包名,而不是只使用包名。如果应用程序支持更改图标或具有多个启动程序活动,则效果会更好
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
}
此函数返回图标drawable,如果失败,则返回null。它首先尝试使用包名和类名获取图标,但如果失败,则只使用包名。如果不想使用类名,则可以使用包名
如果每次都只是捕获异常,并且您知道应用程序已安装,那么您可能缺少一些权限。您也可以使用targetSdkVersion 29
而不是targetSdkVersion 30
重试,因为30为此类功能添加了一些限制,但我不确定这些限制是否也会影响获取图标。非常感谢!我如何才能获得类名?@TheZadok42在ActivityInfo
object中变量名是name
,很抱歉有一个noob问题,但是你能详细说明一下吗?我如何仅从通知中获得这些信息?@TheZadok42呃,对不起,我以为你已经有了这个对象。我有一个启动器和一个d我只是查看了其中的代码。我只是使用packageManager
查询所有应用程序信息,当我运行queryIntentActivities'函数时,它会返回一个
ActivityInfo`对象的列表。它有应用程序名称、图标、包名称、类名等。我真的不知道如何从通知中获取它,我想你不会我需要它。只需在我的原始回复中使用第二个图标功能。(context.packageManager.getApplicationIcon(packageName
)成功了!非常感谢