升级到 Android 8.1 后 startForeground 失败 [英] startForeground fail after upgrade to Android 8.1
问题描述
将我的手机升级到 8.1 Developer Preview 后,我的后台服务无法正常启动.
After upgrading my phone to 8.1 Developer Preview my background service no longer starts up properly.
在我长期运行的服务中,我实现了一个 startForeground
方法来启动在创建时调用的正在进行的通知.
In my long-running service I've implemented a startForeground
method to start the ongoing notification which is called in on create.
@TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
// Safe call, handled by compat lib.
val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
startForeground(101, notification)
}
错误信息:
11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
Process: $PACKAGE_NAME, PID: 24704
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
服务通知的无效频道
,显然我的旧频道 DEFAULT_CHANNEL_ID
不再适用于我假设的 API 27.什么是合适的渠道?我试图查看文档
invalid channel for service notification
, apparently my old channel the DEFAULT_CHANNEL_ID
is no longer appropriate for API 27 I assume. What would be the proper channel? I've tried to look through the documentation
推荐答案
在对不同的解决方案进行了一段时间的修补后,我发现必须在 Android 8.1 及更高版本中创建通知渠道.
After some tinkering for a while with different solutions i found out that one must create a notification channel in Android 8.1 and above.
private fun startForeground() {
val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel("my_service", "My Background Service")
} else {
// If earlier version channel ID is not used
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
""
}
val notificationBuilder = NotificationCompat.Builder(this, channelId )
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(PRIORITY_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build()
startForeground(101, notification)
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel(channelId: String, channelName: String): String{
val chan = NotificationChannel(channelId,
channelName, NotificationManager.IMPORTANCE_NONE)
chan.lightColor = Color.BLUE
chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
service.createNotificationChannel(chan)
return channelId
}
据我所知,后台服务现在显示为普通通知,然后用户可以通过取消选择通知渠道来选择不显示.
From my understanding background services are now displayed as normal notifications that the user then can select to not show by deselecting the notification channel.
更新:另外不要忘记根据Android P的要求添加前台权限:
Update: Also don't forget to add the foreground permission as required Android P:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
这篇关于升级到 Android 8.1 后 startForeground 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!