Blackberry - LocationProvider.getLocation() hangs on

3.5k Views Asked by At

I wrote a very simple application that asks the LocationProvider for a location and prints it to System.out. This works great in the simulator. However, when I run it on my blackberry device, the call to getLocation seems to hang indefinitely. I am running the code in a separate thread that simply gets a provider and asks for the location. I tried it with null Criteria (which should give me the defaults right?) as well as a Criteria that should provide Assist then Autonomous. I've included my code below. When I run this on my device it hangs on the call to getLocation.Here is my code below..plzz tell what i might be doing wrong...

public void getLocation() {
    Thread t = new Thread(new Runnable() {
        private double lat;
        private double lon;
        public void run() {
            Criteria cr = new Criteria();
            cr.setHorizontalAccuracy(Criteria.NO_REQUIREMENT);
            cr.setVerticalAccuracy(Criteria.NO_REQUIREMENT);
            cr.setCostAllowed(false);
            cr.setPreferredPowerConsumption(Criteria.NO_REQUIREMENT);
            cr.setPreferredResponseTime(1000);
            LocationProvider lp = null;
            try {
                lp = LocationProvider.getInstance(cr);
            } catch (LocationException e) {
            // System.out.println("*****************Exception" + e);
            }
            Coordinates c = null;
            if (lp == null) {
                UiApplication.getUiApplication().invokeLater(
                    new Runnable() {
                    public void run() {
                        Dialog.alert("GPS not supported!");
                        return;
                    }
                    });
            } else {
                // System.out.println("OK");
                switch (lp.getState()) {
                case LocationProvider.AVAILABLE:
                // System.out.println("Provider is AVAILABLE");
                        Location l = null;
                        try {
                        l = lp.getLocation(-1);
                    } catch (LocationException e) {
                    // System.out.println("***Location Exception caught "
                    // + e);
                    } catch (InterruptedException e) {
                    // System.out.println("***Interrupted Exception aught:"
                    // + e);
                    } catch (Exception e) {
                    // System.out.println("***Exception caught :"
                    // ;+ e);
                    }
                        if (l != null && l.isValid()) {
                        c = l.getQualifiedCoordinates();
                    }
                    if (c != null) {
                            lat = c.getLatitude();
                        lon = c.getLongitude();
                        System.out.println(lat + "  -  " + lon);
                    }
                }
            }
        }
    });
    t.start();
}
2

There are 2 best solutions below

0
On BEST ANSWER

try to:


Talking about hanging threads,

locationProvider.getLocation(-1) 

hangs because if you use -1, there will be no timeout. Try this:

    int timeout = 120;
    try {
        location = provider.getLocation(timeout);
    } catch (LocationException e) {
        System.out.println("Location timeout");
    } catch (InterruptedException e) {
        System.out.println("InterruptedException"+e.getMessage());
    }

Also, if youre using System.out.println(text) in simulator, on device it would be better to

getApplication().invokeLater(new Runnable(){
    public void run() {
        screen.add(new LabelField(text));           
    }
});

or

getApplication().invokeLater(new Runnable(){
    public void run() {
        Dialog.inform(text);            
    }
});
0
On

the -1 timeout thing should be ok, it should just go to the default. The default may be high though, of if this isn't happening in the background you might want to set the timeout at something smaller like 15 seconds.

The reason this works in the simulator but hangs on an actual device is probably that you don't have a GPS fix on the device where you do the testing...

I'm not kidding, have you tried this outside?