Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android 8.1 - invalid channel for service notification #393

Open
maerlynflagg opened this issue Aug 1, 2018 · 20 comments
Open

Android 8.1 - invalid channel for service notification #393

maerlynflagg opened this issue Aug 1, 2018 · 20 comments

Comments

@maerlynflagg
Copy link

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)
@writer0713
Copy link

@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

@f18nfz
Copy link

f18nfz commented Aug 16, 2018

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!

@victorhugoweb
Copy link

Dont works in Android >= 8

@EvPut
Copy link

EvPut commented Nov 19, 2018

Similar problem on android 8.1 (Xiaomi MI8 Lite)

44b1b1c8-37a7-442d-ae6a-479667618d31

@Gurjit-ONEBCG
Copy link

@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 :(

@Bharat-Rayasam
Copy link

@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.

  1. 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();
   } 
  1. Add below in AndroidManifest.xml file:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  2. 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

@brauliofreire
Copy link

@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.

  1. 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();
   } 
  1. Add below in AndroidManifest.xml file:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  2. 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?

@ziyaddin
Copy link

@brauliofreire is it still working fine on Android 8+ phones?

@brauliofreire
Copy link

@brauliofreire is it still working fine on Android 8+ phones?

yes! I made tests in android 8.1 and it is working fine!!

@ziyaddin
Copy link

@katzer FYI. I haven't tested @Bharat-Rayasam's solution yet but it can be useful for you to come up with stable solution.

@tajindersinghnamdhari
Copy link

@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.

  1. 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();
   } 
  1. Add below in AndroidManifest.xml file:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  2. 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 🥇 💯

@arup-b
Copy link

arup-b commented Feb 16, 2019

I was able to solve it this way: irceline/aq-mobile-be#94 (comment)

@lkonzen-garupa
Copy link

Any chance on this solution be added to the main repo code?

@lkonzen-garupa
Copy link

@katzer any chance?

@fdambrosio
Copy link

I hope that this fix will be added to the main repo code

@thanveerahamed
Copy link

thanveerahamed commented Jun 26, 2019

@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.

  1. 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();
   } 
  1. Add below in AndroidManifest.xml file:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  2. 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());

@ZumelzuR
Copy link

@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.

  1. 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();
   } 
  1. Add below in AndroidManifest.xml file:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  2. 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

@kapilSoni101
Copy link

@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?

@app2b
Copy link

app2b commented Jan 1, 2021

  1. ForegroundService.java

I couldn't find the .java file, could you tell me where to find it?

@karimslim
Copy link

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>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests