当前位置: 首页 > 知识库问答 >
问题:

升级到Android8.1后startForeground失败

壤驷建德
2023-03-14
@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)

共有1个答案

归翔
2023-03-14

在对不同的解决方案进行了一段时间的修补后,我发现必须在Android8.1及以上版本中创建一个通知通道。

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
}

根据我的理解,后台服务现在显示为普通通知,然后用户可以通过取消选择通知通道来选择不显示。

更新:也别忘了按要求添加前台权限Android P:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 类似资料:
  • 我们最近将VS 2010和.NET 4应用程序升级为VS 2012和.NET 4.5。我们有一个构建脚本来在测试服务器上部署应用程序。我们有两个框-一个是Windows 8和VS 2012(新安装),另一个是Windows 7和VS 2010和VS 2012(新安装)。 从Windows 8运行构建脚本时,box构建脚本运行良好,并将应用程序部署到测试服务器。但从Windows 7 box部署应用

  • 我最近更新了我的项目的gradle版本,从2.14.1到3.0。从那以后,gradle构建每次都失败,出现以下错误: 错误:原因:org.gradle.api.internal.tasks.defaultTaskinputs$TaskinputUnionFileCollection无法强制转换为org.gradle.api.internal.file.Collections.defaultConf

  • 问题内容: 我已经将我的Jenkins服务器升级到1.505,但是意外地使用Maven插件构建无法正常工作,并且在Jenkins日志中引发了异常 经过一个小时的搜索,我发现Maven插件家伙升级了他们的代码库,并且由于“可选”依赖项而失败,因此我添加了“可选插件”,但它仍然无声地失败,并且在Jenkins日志中没有任何异常。 错误出现在控制台日志上是 有什么提示吗? 问题答案: 新的maven插件

  • 方法一:利用BIOS Boot Block引导块 现在用Award BIOS的主板都有一个BIOS引导块,当你升级BIOS时,这一小部分引导块可以不被覆盖(BootBlock Write 跳线设置为“Disable”,并且在运行Flash程序时,不选择“UpdateBIOS Including Boot Block”方式)。这个BIOS引导块只支持软驱和ISA显示卡,所以很多人在升级BIOS失败后

  • 我正在docker文件中使用量角器(5.4.2版)运行测试。google chrome升级到76版后,测试开始失败,出现以下错误: 我尝试了几种方法来解决这个问题: 1)试图将chrome版本标记为以前的版本。但是chrome移动到稳定版本,以前的版本是铬的。 2)也在网上寻找了一些可能的解决方案来下载,但对我不起作用 3)网络驱动程序管理器更新-versions.chrome76.0.3809.