Nach dem Upgrade meines Telefons auf 8.1 Developer Preview wird mein Hintergrunddienst nicht mehr ordnungsgemäß gestartet.
In meinem langjährigen Dienst habe ich eine startForeground-Methode implementiert, um die laufende Benachrichtigung zu starten, die beim Erstellen aufgerufen wird.
@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)
}
Fehlermeldung:
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)
Ungültiger Kanal für Dienstbenachrichtigung , anscheinend ist mein alter Kanal, die DEFAULT_CHANNEL_ID, nicht mehr für API 27 geeignet, nehme ich an. Was wäre der richtige Kanal? Ich habe versucht, die Dokumentation durchzusehen
Antworten:
Nach einigem Basteln mit verschiedenen Lösungen stellte ich fest, dass man in Android 8.1 und höher einen Benachrichtigungskanal erstellen muss.
Nach meinem Verständnis werden Hintergrunddienste jetzt als normale Benachrichtigungen angezeigt, die der Benutzer auswählen kann, um sie nicht anzuzeigen, indem er den Benachrichtigungskanal abwählt.
Update : Vergessen Sie auch nicht, die Vordergrundberechtigung nach Bedarf hinzuzufügen. Android P:
quelle
IMPORTANCE_DEFAULT
stattIMPORTANCE_NONE
?Java-Lösung (Android 9.0, API 28)
Fügen Sie in Ihrer
Service
Klasse Folgendes hinzu:UPDATE: ANDROID 9.0 PIE (API 28)
Fügen Sie diese Berechtigung zu Ihrer
AndroidManifest.xml
Datei hinzu:quelle
Die erste Antwort ist nur für diejenigen großartig, die Kotlin kennen. Für diejenigen, die hier noch Java verwenden, übersetze ich die erste Antwort
Für Android, P vergessen Sie nicht, diese Erlaubnis einzuschließen
quelle
Funktioniert ordnungsgemäß mit Andorid 8.1:
Aktualisiertes Beispiel (ohne veralteten Code):
Old snipped (es ist eine andere App - nicht mit dem obigen Code verwandt):
quelle
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
zuNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
was ist besser zu benutzen?In meinem Fall haben wir versucht, eine Benachrichtigung zu veröffentlichen, ohne Folgendes anzugeben
NotificationChannel
:Der beste Ort, um den obigen Code einzufügen, ist die
onCreate()
Methode in derApplication
Klasse, sodass wir sie nur ein für alle Mal deklarieren müssen:Nachdem wir dies eingerichtet haben, können wir die Benachrichtigung mit dem
channelId
soeben angegebenen verwenden:Dann können wir damit eine Benachrichtigung veröffentlichen:
Wenn Sie es als Benachrichtigung für den Vordergrunddienst verwenden möchten:
quelle
Dank @CopsOnRoad war seine Lösung eine große Hilfe, funktioniert aber nur für SDK 26 und höher. Meine App zielt auf 24 und höher ab.
Damit sich Android Studio nicht beschwert, benötigen Sie eine Bedingung direkt um die Benachrichtigung. Es ist nicht klug genug zu wissen, dass sich der Code in einer von VERSION_CODE.O bedingten Methode befindet.
quelle
Das hat bei mir funktioniert. In meiner Serviceklasse habe ich den Benachrichtigungskanal für Android 8.1 wie folgt erstellt:
Hinweis: Erstellen Sie den Kanal, für den Sie die Benachrichtigung erstellen
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
quelle
Hier ist meine Lösung
Hoffe es wird helfen :)
quelle