android - 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 但仍然遇到相同的错误。
请帮忙...
解决方案
要获取系统服务,我们通常需要Context
对象和某种服务标识符(例如String
)。当我们从Activity
(或例如Service
)获取系统服务时,我们只需要提供一个标识符,因为Activity
它本身就是一个Context
对象,所以Context
是已知的。在这种情况下,我们使用Context.getSystemService()函数。
在您的情况下,您不在Context
,所以我不确定getSystemService()
您使用的功能是什么。也许您导入了一个静态函数:ContextCompat.getSystemService()。在这种情况下,正如您在文档中看到的那样,您需要同时提供Context
服务标识符和服务标识符。
但无论如何,工作人员可以使用属性访问上下文applicationContext
,因此您应该能够获得系统服务
val manager= applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
推荐阅读
- python - 如何使用 [] 和 {} 猴子补丁列表和字典创建?
- mysql - 如何编写具有两个左连接和两个计数的 MySql 查询
- php - 获取不带时间戳的数组数据
- sql - 在第一个 where 子句上过滤数据集,然后在第二个 where 子句上过滤剩余的数据集
- python - 我想使用熊猫绘制我的数据框的第一行
- php - 我正在使用 manjaro 并且无法使用 php artisan 迁移它显示找不到 sql 驱动程序
- css - 添加图片时有空格
- typescript - Where is the return type of typeof defined?
- manim - 如何在 Manim 中创建分段函数图?
- javascript - JavaScript 画布游戏在一段时间后下降 FPS