После обновления телефона до 8.1 Developer Preview моя фоновая служба больше не запускается должным образом.
В моем давно работающем сервисе я реализовал метод startForeground для запуска текущего уведомления, которое вызывается при создании.
@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, я полагаю. Какой будет правильный канал? Я пытался просмотреть документацию
Ответы:
Немного поработав с различными решениями, я обнаружил, что необходимо создать канал уведомлений в Android 8.1 и выше.
Из моего понимания фоновые сервисы теперь отображаются как обычные уведомления, которые пользователь затем может выбрать, чтобы не показывать, отменив выбор канала уведомлений.
Обновление : также не забудьте добавить разрешение переднего плана при необходимости Android P:
источник
IMPORTANCE_DEFAULT
вместоIMPORTANCE_NONE
?Решение Java (Android 9.0, API 28)
В своем
Service
классе добавьте это:ОБНОВЛЕНИЕ: ANDROID 9.0 PIE (API 28)
Добавьте это разрешение в ваш
AndroidManifest.xml
файл:источник
Первый ответ хорош только для тех, кто знает kotlin, для тех, кто все еще использует java, я перевожу первый ответ
Для Android, P не забудьте включить это разрешение
источник
Работает правильно на Андорид 8.1:
Обновленный образец (без устаревшего кода):
Old snipped (это другое приложение - не относится к коду выше):
источник
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
наNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
что лучше использовать?В моем случае это потому, что мы пытались опубликовать уведомление без указания
NotificationChannel
:Лучшее место для кода выше -
onCreate()
метод вApplication
классе, так что нам просто нужно объявить его раз и навсегда:После того, как мы настроим это, мы можем использовать уведомление с
channelId
только что указанным:Затем мы можем использовать его для отправки уведомления:
Если вы хотите использовать его в качестве уведомления службы переднего плана:
источник
Благодаря @CopsOnRoad его решение очень помогло, но работает только для SDK 26 и выше. Мое приложение предназначено для 24 и выше.
Чтобы Android Studio не жаловалась, вам нужно использовать условные выражения непосредственно вокруг уведомления. Он недостаточно умен, чтобы знать, что код находится в методе, условном для VERSION_CODE.O.
источник
Это сработало для меня. В своем классе обслуживания я создал канал уведомлений для Android 8.1, как показано ниже:
Примечание. Создайте канал, для которого вы создаете уведомление.
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
источник
Вот мое решение
Надеюсь, это поможет :)
источник