Search code examples
androidibm-mobilefirstworklight-geolocation

WLGeolocationPlugin.getLocation giving no answer on emulator or device


Worklight 6.2.0.00-20120814-0824

Location code runs fine in Browser simulator but fails in Android emulator, neither success nor failure callbacks firing.

Logcat shows:

10-06 16:00:40.707: W/PluginManager(3193): THREAD WARNING: exec() call to WLGeolocationPlugin.getLocation blocked the main thread for 75ms. Plugin should use CordovaInterface.getThreadPool().

code:

var showPosition = function(position) {
        WL.Logger.debug("got a position");
        var latitude = Number(position.coords.latitude).toFixed(2);
        var longitude = Number(position.coords.longitude).toFixed(2);
        $("#currentLocation").text(latitude + " / " + longitude);

    };

    var positionError = function(err) { 
        WL.Logger.debug("failed to get  a position");
        $("#status").text("position error" + err); 

    };

    var geoPolicy = WL.Device.Geo.Profiles.RoughTracking(); // other profiles tried, same result

    WL.Device.Geo.acquirePosition(showPosition, positionError, geoPolicy);

Android manifest has

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/> 

Before I added those I had different error conditions, indicating permissions errors, so I think permissions are now correct.

-------edited to add more info ----

I have deployed to a real Android device but still get no callbacks fired. I do see these messages in LogCat, indicating that Worklight is doing something with gps, but not providing answers so far as my code is concerned

GC_FOR_ALLOC freed 738K, 11% free 10956K/12200K, paused 38ms, total 38ms
[ 10-07 15:30:21.656 13319:13340 D/com.worklight.androidgap.plugin.WLLocationListener ]
WLLocationListener.onLocationChanged in WLLocationListener.java:174 :: The location has been updated!
[ 10-07 15:30:21.661 13319:13340 D/com.worklight.androidgap.plugin.WLLocationListener ]
 WLLocationListener.win in WLLocationListener.java:100 :: Acquired location age: 178 milliseconds. More than maximumAge of 100 milliseconds. Ignoring.
[ 10-07 15:30:21.661 13319:13340 D/com.worklight.androidgap.plugin.WLLocationListener ]
WLLocationListener.onStatusChanged in WLLocationListener.java:156 :: The status of the provider gps has changed
[ 10-07 15:30:21.666 13319:13340 D/com.worklight.androidgap.plugin.WLLocationListener ]
WLLocationListener.onStatusChanged in WLLocationListener.java:162 :: gps is TEMPORARILY_UNAVAILABLE
[ 10-07 15:30:21.686   546:  549 D/dalvikvm ]
 GC_CONCURRENT freed 432K, 6% free 10266K/10920K, paused 1ms+1ms, total 15ms
[ 10-07 15:30:21.686   546:12382 D/dalvikvm ]
WAIT_FOR_CONCURRENT_GC blocked 9ms


 [ 10-07 15:55:05.761 13671:13695 D/com.worklight.androidgap.plugin.WLLocationListener ]
 WLLocationListener.win in WLLocationListener.java:100 :: Acquired location age: 170 milliseconds. More than maximumAge of 100 milliseconds. Ignoring.
 [ 10-07 15:55:05.791 13671:13695 D/dalvikvm ]
GC_FOR_ALLOC freed 530K, 9% free 10268K/11252K, paused 22ms, total 22ms
 [ 10-07 15:55:05.791 13671:13695 D/com.worklight.androidgap.plugin.WLLocationListener ]
 WLLocationListener.onStatusChanged in WLLocationListener.java:156 :: The status of the provider gps has changed
 [ 10-07 15:55:05.796 13671:13695 D/com.worklight.androidgap.plugin.WLLocationListener ]
 WLLocationListener.onStatusChanged in WLLocationListener.java:162 :: gps is TEMPORARILY_UNAVAILABLE
[ 10-07 15:55:06.366 13671:13695 D/NONE     ]
 navigator :: back pages/home.html
[ 10-07 15:55:08.406 13671:13695 D/NONE     ]
 navigator :: loadPage :: myProfile
[ 10-07 15:55:08.431 13671:13695 D/NONE     ]
 myProfile :: buildDepartmentList Art and Architecture,Billing And Accounts,Claims
[ 10-07 15:55:08.441 13671:13695 D/NONE     ]
 myProfile :: myProfileInit fetch acquire pos
[ 10-07 15:55:21.741   365:  568 D/libgps   ]
 proxy_gps_status_cb: called. status(4)
[ 10-07 15:55:21.741   365:  568 D/libgps   ]
 proxy_gps_status_cb: normal GPS icon mode.
[ 10-07 15:55:21.746   365:  568 I/libgps   ]
 disarming wakeLockTimer
[ 10-07 15:55:21.746   365:  568 I/libgps   ]
[proxy_gps_release_wakelock_cb][line = 653]: release_wakelock(0)

Solution

  • The answer seems to be that I need to specify a maximumAge option

      var geoPolicy = WL.Device.Geo.Profiles.RoughTracking(); // other profiles tried, same result
    
      geoPolicy.maximumAge = 5000;
    
      WL.Device.Geo.acquirePosition(showPosition, positionError, geoPolicy);
    

    The logs (shown above) indicate than an answer was obtained but discarded on the basis of its age. Seems like I need to specify maximumAge greater than the time taken to obtain a position.