Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PackageManager不返回应用程序';s图标_Android_Kotlin - Fatal编程技术网

Android PackageManager不返回应用程序';s图标

Android PackageManager不返回应用程序';s图标,android,kotlin,Android,Kotlin,我正在尝试获取应用程序通知的图标。监听器工作得很好,但对于我尝试过的大多数应用程序(电报、信号、android消息…),我似乎无法获取应用程序的图标。 以下是我尝试获取图标的代码: private fun getIcon(通知:StatusBarNotification,上下文:context):位图{ val packageManager=context.packageManager 回击{ createBitmap(drawableToBitmap(packageManager.GetApp

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

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
)成功了!非常感谢