首页 > 解决方案 > Kotlin:类型不匹配:推断类型为 String 但预期为 Context -(kotlin 类特定错误中的通知通道)

问题描述

我正在制作一个需要使用工作管理器发出通知的应用程序,我知道如何在活动中发出通知,但将它们写入单独的 kotlin 文件中,do work方法如下:

class NotificationWorkManager(appContext: Context, workerParams: WorkerParameters):
    Worker(appContext, workerParams) {

    //notification variables
    val CHANNEL_ID = "channel_ID"
    val CHANNEL_NAME = "channel_NAME"
    val NOTIFICATION_ID = 0

    override fun doWork(): Result {


        triggerNotify()
        return Result.success()
    }

    fun triggerNotify(){
        createNotificationChannel()
        //big picture:notification
        val notiStyle = NotificationCompat.BigPictureStyle()
        var remote_picture = BitmapFactory.decodeResource(applicationContext.resources, R.drawable.make_new)
        notiStyle.bigPicture(remote_picture)

//open the app from outside the app
            val intent = Intent(applicationContext, MainActivity::class.java)
            val pendingIntent = TaskStackBuilder.create(applicationContext).run{
                addNextIntentWithParentStack(intent)
                getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
            }
    
//main notification variable
            val notification= NotificationCompat.Builder(applicationContext,CHANNEL_ID)
                .setContentTitle("Workmg")
                .setContentText("basdasdadfhgafgsgsfg")
                .setSmallIcon(R.drawable.ic_bb)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setColor(Color.RED)
                .setStyle(notiStyle)
                .setProgress(100,10,true)//true keeps scroller running
                .setLargeIcon(BitmapFactory.decodeResource(applicationContext.resources, R.drawable.make_new))
                .setContentIntent(pendingIntent)
                .build()
    
            val notificationManager = NotificationManagerCompat.from(applicationContext)
            notificationManager.notify(NOTIFICATION_ID,notification)
        }

    
        fun createNotificationChannel(){
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                val channel= NotificationChannel( CHANNEL_ID,CHANNEL_NAME,
                    NotificationManager.IMPORTANCE_HIGH).apply {
                    lightColor= Color.RED
                    enableLights(true)
                }
                val manager= getSystemService(NOTIFICATION_SERVICE) as NotificationManager
                manager.createNotificationChannel(channel)
            }
        }
    }

我的错误出现在最后几行中,其中manager声明了变量以及下面的红色波浪线NOTIFICATION_SERVICE::

Type mismatch: inferred type is String but Context was expected

如果代码直接写在Main Activity我没有在这种情况下执行的代码中,则不会发生这种情况,因为我想在Work Manager.

我尝试使用 Context.NOTIFICATION_SERVICE 但仍然遇到相同的错误。

请帮忙...

标签: androidkotlinnotificationsandroid-contextandroid-workmanager

解决方案


要获取系统服务,我们通常需要Context对象和某种服务标识符(例如String)。当我们从Activity(或例如Service)获取系统服务时,我们只需要提供一个标识符,因为Activity它本身就是一个Context对象,所以Context是已知的。在这种情况下,我们使用Context.getSystemService()函数。

在您的情况下,您不在Context,所以我不确定getSystemService()您使用的功能是什么。也许您导入了一个静态函数:ContextCompat.getSystemService()。在这种情况下,正如您在文档中看到的那样,您需要同时提供Context服务标识符和服务标识符。

但无论如何,工作人员可以使用属性访问上下文applicationContext,因此您应该能够获得系统服务

val manager= applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager

推荐阅读