katzer / cordova-plugin-background-mode

Keep app running in background
Apache License 2.0
1.38k stars 1.02k forks source link

Android 8.1 - invalid channel for service notification #393

Open maerlynflagg opened 6 years ago

maerlynflagg commented 6 years ago

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 commented 6 years ago

@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 commented 6 years ago

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 commented 5 years ago

Dont works in Android >= 8

EvPut commented 5 years ago

Similar problem on android 8.1 (Xiaomi MI8 Lite)

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

Gurjit-ONEBCG commented 5 years ago

@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 commented 5 years ago

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

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

brauliofreire commented 5 years ago

@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 commented 5 years ago

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

brauliofreire commented 5 years ago

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

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

ziyaddin commented 5 years ago

@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 commented 5 years ago

@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 :1st_place_medal: :100:

arup-b commented 5 years ago

I was able to solve it this way: https://github.com/irceline/aq-mobile-be/issues/94#issuecomment-464293865

lkonzen-garupa commented 5 years ago

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

lkonzen-garupa commented 5 years ago

@katzer any chance?

fdambrosio commented 5 years ago

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

thanveerahamed commented 5 years ago

@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 commented 4 years ago

@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 commented 4 years ago

@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 commented 3 years ago
  1. ForegroundService.java

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

karimslim commented 3 years ago

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>