Po uaktualnieniu telefonu do wersji 8.1 Developer Preview moja usługa w tle nie uruchamia się poprawnie.
W mojej długo działającej usłudze zaimplementowałem metodę startForeground, aby rozpocząć bieżące powiadomienie, które jest wywoływane podczas tworzenia.
@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)
}
Komunikat o błędzie:
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)
niepoprawny kanał do powiadamiania usługi , najwyraźniej mój stary kanał DEFAULT_CHANNEL_ID nie jest już odpowiedni dla API 27. Jaki byłby właściwy kanał? Próbowałem przejrzeć dokumentację
Odpowiedzi:
Po jakimś majsterkowaniu przez jakiś czas przy różnych rozwiązaniach odkryłem, że należy utworzyć kanał powiadomień w systemie Android 8.1 i nowszych.
Z mojego zrozumienia usługi w tle są teraz wyświetlane jako normalne powiadomienia, które użytkownik może następnie wybrać, aby nie wyświetlać, usuwając zaznaczenie kanału powiadomień.
Aktualizacja : Nie zapomnij również dodać uprawnienia do pierwszego planu jako wymaganego Androida P:
źródło
IMPORTANCE_DEFAULT
zamiastIMPORTANCE_NONE
?Rozwiązanie Java (Android 9.0, API 28)
Dodaj do swojej
Service
klasy:AKTUALIZACJA: ANDROID 9.0 PIE (API 28)
Dodaj to uprawnienie do swojego
AndroidManifest.xml
pliku:źródło
Pierwsza odpowiedź jest świetna tylko dla tych, którzy znają kotlina, dla tych, którzy nadal używają java tutaj, tłumaczę pierwszą odpowiedź
W przypadku Androida P nie zapomnij dołączyć tego uprawnienia
źródło
Działa poprawnie w Andorid 8.1:
Zaktualizowana próbka (bez przestarzałego kodu):
Stary snipped (to inna aplikacja - nie związanych z powyższym kodzie):
źródło
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
naNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
lepiej używać?W moim przypadku jest tak, ponieważ próbowaliśmy opublikować powiadomienie bez określenia
NotificationChannel
:Najlepszym miejscem do umieszczenia powyższego kodu jest
onCreate()
metoda wApplication
klasie, dlatego musimy zadeklarować go raz na zawsze:Po tym, jak to skonfigurujemy, możemy użyć powiadomienia z
channelId
podanym przez nas:Następnie możemy użyć go do opublikowania powiadomienia:
Jeśli chcesz go używać jako powiadomienia usługi nowej wiedzy:
źródło
Dzięki @CopsOnRoad jego rozwiązanie było dużą pomocą, ale działa tylko dla SDK 26 i wyższych. Moja aplikacja jest kierowana na 24 i więcej.
Aby Android Studio nie narzekało, potrzebujesz warunku bezpośrednio wokół powiadomienia. Nie jest wystarczająco mądry, aby wiedzieć, że kod jest metodą zależną od VERSION_CODE.O.
źródło
To zadziałało dla mnie. W mojej klasie usług utworzyłem kanał powiadomień dla Androida 8.1, jak poniżej:
Uwaga: Utwórz kanał, dla którego tworzysz Powiadomienie
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
źródło
Oto moje rozwiązanie
Mam nadzieję, że to pomoże :)
źródło