Search code examples
cordovaionic-frameworkcordova-plugins

BackgroundGeolocation is not working, is not defined


Android
Device manufacturer and model: Samsung Galaxy s7
Cordova version: 8.0.0

        cordova-android-play-services-gradle-release 1.4.2 "cordova-android-play-services-gradle-release"
        cordova-plugin-device 2.0.2 "Device"
        cordova-plugin-facebook4 2.1.0 "Facebook Connect"
        cordova-plugin-geolocation 4.0.1 "Geolocation"
        cordova-plugin-googlemaps 2.3.2 "cordova-plugin-googlemaps"
        cordova-plugin-inappbrowser 3.0.0 "InAppBrowser"
        cordova-plugin-ionic-keyboard 2.1.2 "cordova-plugin-ionic-keyboard"
        cordova-plugin-ionic-webview 1.2.1 "cordova-plugin-ionic-webview"
        cordova-plugin-mauron85-background-geolocation 2.3.5 "CDVBackgroundGeolocation"
        cordova-plugin-request-location-accuracy 2.2.3 "Request Location Accuracy"
        cordova-plugin-splashscreen 5.0.2 "Splashscreen"
        cordova-plugin-whitelist 1.3.3 "Whitelist"
        cordova.plugins.diagnostic 4.0.8 "Diagnostic"

I am trying to use this plugin for IONIC1 and use the code provided in the "README" of this page. when I compile and tested on my galaxy s7, I am getting this error:

BackgroundGeolocation is not defined

BackgroundGeolocation is not defined

I am using this code:

app.controller('loginController', function($scope,$timeout) {
function onDeviceReady() {
  BackgroundGeolocation.configure({
    locationProvider: BackgroundGeolocation.ACTIVITY_PROVIDER,
    desiredAccuracy: BackgroundGeolocation.HIGH_ACCURACY,
    stationaryRadius: 50,
    distanceFilter: 50,
    notificationTitle: 'Background tracking',
    notificationText: 'enabled',
    debug: true,
    interval: 10000,
    fastestInterval: 5000,
    activitiesInterval: 10000,
    url: 'http://192.168.81.15:3000/location',
    httpHeaders: {
      'X-FOO': 'bar'
    },
    // customize post properties
    postTemplate: {
      lat: '@latitude',
      lon: '@longitude',
      foo: 'bar' // you can also add your own properties
    }
  });

  BackgroundGeolocation.on('location', function(location) {
    // handle your locations here
    // to perform long running operation on iOS
    // you need to create background task
    BackgroundGeolocation.startTask(function(taskKey) {
      // execute long running task
      // eg. ajax post location
      // IMPORTANT: task has to be ended by endTask
      BackgroundGeolocation.endTask(taskKey);
    });
  });

  BackgroundGeolocation.on('stationary', function(stationaryLocation) {
    // handle stationary locations here
  });

  BackgroundGeolocation.on('error', function(error) {
    console.log('[ERROR] BackgroundGeolocation error:', error.code, error.message);
  });

  BackgroundGeolocation.on('start', function() {
    console.log('[INFO] BackgroundGeolocation service has been started');
  });

  BackgroundGeolocation.on('stop', function() {
    console.log('[INFO] BackgroundGeolocation service has been stopped');
  });

  BackgroundGeolocation.on('authorization', function(status) {
    console.log('[INFO] BackgroundGeolocation authorization status: ' + status);
    if (status !== BackgroundGeolocation.AUTHORIZED) {
      // we need to set delay or otherwise alert may not be shown
      setTimeout(function() {
        var showSettings = confirm('App requires location tracking permission. Would you like to open app settings?');
        if (showSetting) {
          return BackgroundGeolocation.showAppSettings();
        }
      }, 1000);
    }
  });

  BackgroundGeolocation.on('background', function() {
    console.log('[INFO] App is in background');
    // you can also reconfigure service (changes will be applied immediately)
    BackgroundGeolocation.configure({ debug: true });
  });

  BackgroundGeolocation.on('foreground', function() {
    console.log('[INFO] App is in foreground');
    BackgroundGeolocation.configure({ debug: false });
  });

  BackgroundGeolocation.checkStatus(function(status) {
    console.log('[INFO] BackgroundGeolocation service is running', status.isRunning);
    console.log('[INFO] BackgroundGeolocation services enabled', status.locationServicesEnabled);
    console.log('[INFO] BackgroundGeolocation auth status: ' + status.authorization);

    // you don't need to check status before start (this is just the example)
    if (!status.isRunning) {
      BackgroundGeolocation.start(); //triggers start on start event
    }
  });

  // you can also just start without checking for status
  // BackgroundGeolocation.start();

  // Don't forget to remove listeners at some point!
  // BackgroundGeolocation.events.forEach(function(event) {
  //   return BackgroundGeolocation.removeAllListeners(event);
  // });
}

document.addEventListener('deviceready', onDeviceReady, false);

});

What am I missing or what am I doing wrong?


Solution

  • cordova-plugin-mauron85-background-geolocation 2.3.5

    You are using plugin version 2.x and not 3.0.

    From the Migration documentation to 3.0,

    backgroundGeolocation object renamed to BackgroundGeolocation

    You can either update the plugin version to the latest one.

    ionic cordova plugin rm cordova-plugin-mauron85-background-geolocation
    ionic cordova plugin add cordova-plugin-mauron85-background-geolocation
    

    Or

    use

     backgroundGeolocation.configure({...})
    

    I would go with the first option since the migration change docs list many breaking changes.