Kotlin:类型不匹配:推断类型为 String 但预期为 Context -(kotlin 中的通知通道 - class 特定错误)
Kotlin: Type mismatch: inferred type is String but Context was expected -(notification channel in kotlin-class specific error)
我正在制作一个需要使用工作管理器来发出通知的应用程序,我知道如何在 activity 中发出通知,但将它们写在 do work
中的单独的 kotlin 文件中方法如下:
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 但仍然出现相同的错误。
请帮忙...
要获取系统服务,我们通常需要Context
对象和某种服务标识符(例如String
)。当我们从Activity
(或例如Service
)获取系统服务时,我们只需要提供一个标识符,因为Activity
本身就是一个Context
对象,所以Context
已经知道了。在这种情况下,我们使用 Context.getSystemService() 函数。
在您的情况下,您不在 Context
范围内,所以我不确定您使用的 getSystemService()
函数是什么。也许您导入了一个静态函数:ContextCompat.getSystemService()。在这种情况下,正如您在文档中看到的那样,您需要同时提供 Context
和服务标识符。
但无论如何,工作人员可以使用 applicationContext
属性 访问上下文,因此您应该能够使用
获取系统服务
val manager= applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
我正在制作一个需要使用工作管理器来发出通知的应用程序,我知道如何在 activity 中发出通知,但将它们写在 do work
中的单独的 kotlin 文件中方法如下:
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 但仍然出现相同的错误。
请帮忙...
要获取系统服务,我们通常需要Context
对象和某种服务标识符(例如String
)。当我们从Activity
(或例如Service
)获取系统服务时,我们只需要提供一个标识符,因为Activity
本身就是一个Context
对象,所以Context
已经知道了。在这种情况下,我们使用 Context.getSystemService() 函数。
在您的情况下,您不在 Context
范围内,所以我不确定您使用的 getSystemService()
函数是什么。也许您导入了一个静态函数:ContextCompat.getSystemService()。在这种情况下,正如您在文档中看到的那样,您需要同时提供 Context
和服务标识符。
但无论如何,工作人员可以使用 applicationContext
属性 访问上下文,因此您应该能够使用
val manager= applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager