cordova-plugin-background-mode
cordova-plugin-background-mode copied to clipboard
Android 8.1 - invalid channel for service notification
i'm develope ionic app and there i'm used this plugin.
after opening my app and the app is loaded, i called the function "backgroundmode.enable()". after a short timespan app stopped with the issue:
invalid channel for service notification
after removing the usage of this plugin the app isn't stopped and runs all the time. all fine.
so, i checked this. i have added the plugin usage again and the exception came back. i removed it again, exception is gone
this is the full stacktrace, which is shown in Logcat (Android Studio):
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=null pri=-2 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2105)
at android.os.Handler.dispatchMessage(Handler.java:109)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7377)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
@maerlynflagg I also spent long time to solve this problem. I solved this problem with below github (fork version).
try below command.
$ ionic cordova platform rm android
$ ionic cordova platform rm ios
$ ionic cordova plugin add https://github.com/tushe/cordova-plugin-background-mode.git
$ npm install --save @ionic-native/background-mode
$ ionic cordova platform add android
$ ionic cordova platform add ios
Have similar issues with Android 8.1 however re-adding the platform didn't resolve it.
On Android P (Pixel 2) I receive the following error:
Issue: java.lang.RuntimeException: Unable to create service de.appplant.cordova.plugin.background.ForegroundService: java.lang.SecurityException: Permission Denial: startForeground from pid=17789, uid=10151 requires android.permission.FOREGROUND_SERVICE
So if I add the permission android.permission.FOREGROUND_SERVICE I get the fatal exception:
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification
Looks like an update might be needed - maybe something like this? ([https://stackoverflow.com/questions/47531742/startforeground-fail-after-upgrade-to-android-8-1])
EDIT: thanks @writer0713 that version has the fixes, updating ForegroundService.java with the updates from that git fixed the issue!
Dont works in Android >= 8
Similar problem on android 8.1 (Xiaomi MI8 Lite)
@maerlynflagg
@maerlynflagg I also spent long time to solve this problem. I solved this problem with below github (fork version).
try below command.
$ ionic cordova platform rm android $ ionic cordova platform rm ios $ ionic cordova plugin add https://github.com/tushe/cordova-plugin-background-mode.git $ npm install --save @ionic-native/background-mode $ ionic cordova platform add android $ ionic cordova platform add ios
@writer0713 This fixed the crash issue, but background plugin stopped working :(
@Gurjit-ONEBCG
Below changes in the cordova-plugin-background-mode worked for me. Crash issue is resolved as well as background plugin is working fine.
- In ForegroundService.java made below changes:
a) Add below import statement:
import android.app.NotificationChannel;
b) Add below global variables:
public static final String NOTIFICATION_CHANNEL_ID_SERVICE = "de.appplant.cordova.plugin.background";
public static final String NOTIFICATION_CHANNEL_ID_INFO = "com.package.download_info";
c) Replace keepAwake() method with below code:
private void keepAwake() {
JSONObject settings = BackgroundMode.getSettings();
boolean isSilent = settings.optBoolean("silent", false);
if (!isSilent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, "App Service", NotificationManager.IMPORTANCE_DEFAULT));
nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO, "Download Info", NotificationManager.IMPORTANCE_DEFAULT));
} else {
startForeground(NOTIFICATION_ID, makeNotification());
}
}
PowerManager powerMgr = (PowerManager)
getSystemService(POWER_SERVICE);
wakeLock = powerMgr.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "BackgroundMode");
wakeLock.acquire();
}
-
Add below in AndroidManifest.xml file:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
-
In code where I invoked background mode plugin, used disableWebViewOptimizations option on activate:
cordova.plugins.backgroundMode.on('activate', function() {
cordova.plugins.backgroundMode.disableWebViewOptimizations();
});
Alternately, you can try https://github.com/katzer/cordova-plugin-background-mode/pull/416 but do remember to add FOREGROUND_SERVICE permission in AndroidManifest
@Gurjit-ONEBCG
Below changes in the cordova-plugin-background-mode worked for me. Crash issue is resolved as well as background plugin is working fine.
- In ForegroundService.java made below changes: a) Add below import statement:
import android.app.NotificationChannel;
b) Add below global variables:public static final String NOTIFICATION_CHANNEL_ID_SERVICE = "de.appplant.cordova.plugin.background"; public static final String NOTIFICATION_CHANNEL_ID_INFO = "com.package.download_info";
c) Replace keepAwake() method with below code:
private void keepAwake() { JSONObject settings = BackgroundMode.getSettings(); boolean isSilent = settings.optBoolean("silent", false); if (!isSilent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, "App Service", NotificationManager.IMPORTANCE_DEFAULT)); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO, "Download Info", NotificationManager.IMPORTANCE_DEFAULT)); } else { startForeground(NOTIFICATION_ID, makeNotification()); } } PowerManager powerMgr = (PowerManager) getSystemService(POWER_SERVICE); wakeLock = powerMgr.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "BackgroundMode"); wakeLock.acquire(); }
- Add below in AndroidManifest.xml file:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- In code where I invoked background mode plugin, used disableWebViewOptimizations option on activate:
cordova.plugins.backgroundMode.on('activate', function() { cordova.plugins.backgroundMode.disableWebViewOptimizations(); });
Alternately, you can try #416 but do remember to add FOREGROUND_SERVICE permission in AndroidManifest
thanks!!! Work Great!!! I have a question. do I need do the changes everytime I compile my phonegap/android platform?
@brauliofreire is it still working fine on Android 8+ phones?
@brauliofreire is it still working fine on Android 8+ phones?
yes! I made tests in android 8.1 and it is working fine!!
@katzer FYI. I haven't tested @Bharat-Rayasam's solution yet but it can be useful for you to come up with stable solution.
@Gurjit-ONEBCG
Below changes in the cordova-plugin-background-mode worked for me. Crash issue is resolved as well as background plugin is working fine.
- In ForegroundService.java made below changes: a) Add below import statement:
import android.app.NotificationChannel;
b) Add below global variables:public static final String NOTIFICATION_CHANNEL_ID_SERVICE = "de.appplant.cordova.plugin.background"; public static final String NOTIFICATION_CHANNEL_ID_INFO = "com.package.download_info";
c) Replace keepAwake() method with below code:
private void keepAwake() { JSONObject settings = BackgroundMode.getSettings(); boolean isSilent = settings.optBoolean("silent", false); if (!isSilent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, "App Service", NotificationManager.IMPORTANCE_DEFAULT)); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO, "Download Info", NotificationManager.IMPORTANCE_DEFAULT)); } else { startForeground(NOTIFICATION_ID, makeNotification()); } } PowerManager powerMgr = (PowerManager) getSystemService(POWER_SERVICE); wakeLock = powerMgr.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "BackgroundMode"); wakeLock.acquire(); }
- Add below in AndroidManifest.xml file:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- In code where I invoked background mode plugin, used disableWebViewOptimizations option on activate:
cordova.plugins.backgroundMode.on('activate', function() { cordova.plugins.backgroundMode.disableWebViewOptimizations(); });
Alternately, you can try #416 but do remember to add FOREGROUND_SERVICE permission in AndroidManifest
@Bharat-Rayasam Thanks for this great help :1st_place_medal: :100:
I was able to solve it this way: https://github.com/irceline/aq-mobile-be/issues/94#issuecomment-464293865
Any chance on this solution be added to the main repo code?
@katzer any chance?
I hope that this fix will be added to the main repo code
@Gurjit-ONEBCG
Below changes in the cordova-plugin-background-mode worked for me. Crash issue is resolved as well as background plugin is working fine.
- In ForegroundService.java made below changes: a) Add below import statement:
import android.app.NotificationChannel;
b) Add below global variables:public static final String NOTIFICATION_CHANNEL_ID_SERVICE = "de.appplant.cordova.plugin.background"; public static final String NOTIFICATION_CHANNEL_ID_INFO = "com.package.download_info";
c) Replace keepAwake() method with below code:
private void keepAwake() { JSONObject settings = BackgroundMode.getSettings(); boolean isSilent = settings.optBoolean("silent", false); if (!isSilent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, "App Service", NotificationManager.IMPORTANCE_DEFAULT)); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO, "Download Info", NotificationManager.IMPORTANCE_DEFAULT)); } else { startForeground(NOTIFICATION_ID, makeNotification()); } } PowerManager powerMgr = (PowerManager) getSystemService(POWER_SERVICE); wakeLock = powerMgr.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "BackgroundMode"); wakeLock.acquire(); }
- Add below in AndroidManifest.xml file:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- In code where I invoked background mode plugin, used disableWebViewOptimizations option on activate:
cordova.plugins.backgroundMode.on('activate', function() { cordova.plugins.backgroundMode.disableWebViewOptimizations(); });
Alternately, you can try #416 but do remember to add FOREGROUND_SERVICE permission in AndroidManifest
@Bharat-Rayasam this was the best solution! My application now works like a charm! Thank you!
I had to make a slight change though. this.backgroundMode.on('activate').subscribe(() => this.backgroundMode.disableWebViewOptimizations());
@Gurjit-ONEBCG
Below changes in the cordova-plugin-background-mode worked for me. Crash issue is resolved as well as background plugin is working fine.
- In ForegroundService.java made below changes: a) Add below import statement:
import android.app.NotificationChannel;
b) Add below global variables:public static final String NOTIFICATION_CHANNEL_ID_SERVICE = "de.appplant.cordova.plugin.background"; public static final String NOTIFICATION_CHANNEL_ID_INFO = "com.package.download_info";
c) Replace keepAwake() method with below code:
private void keepAwake() { JSONObject settings = BackgroundMode.getSettings(); boolean isSilent = settings.optBoolean("silent", false); if (!isSilent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, "App Service", NotificationManager.IMPORTANCE_DEFAULT)); nm.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO, "Download Info", NotificationManager.IMPORTANCE_DEFAULT)); } else { startForeground(NOTIFICATION_ID, makeNotification()); } } PowerManager powerMgr = (PowerManager) getSystemService(POWER_SERVICE); wakeLock = powerMgr.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "BackgroundMode"); wakeLock.acquire(); }
- Add below in AndroidManifest.xml file:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- In code where I invoked background mode plugin, used disableWebViewOptimizations option on activate:
cordova.plugins.backgroundMode.on('activate', function() { cordova.plugins.backgroundMode.disableWebViewOptimizations(); });
Alternately, you can try #416 but do remember to add FOREGROUND_SERVICE permission in AndroidManifest
did you do a merge request? :D
@Bharat-Rayasam :- sir I tried ur code but is working only in some Android devices and all devices are version 9.i tested in Oppo F11pro,nokia, Samsung,but it's working only in Oppo Device another device I got same error.now what I do now sir plz help me?
- ForegroundService.java
I couldn't find the .java file, could you tell me where to find it?
Hi,
You could add FOREGROUND_SERVICE permission in your app once without updating AndroidManifest everytime you build the app.
Add those lines to your config.xml to grant the missing permission:
<config-file parent="./" target="app/src/main/AndroidManifest.xml" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </config-file>