I've pasted a simple application that stops getting fixes from a bluetooth GPS unit when it goes out of range or turned off... and then is turned back on/comes back in range. This is a one-shot TimerTask-based LocationProvider.getLocation that will return timeouts forever after the condition occurs. Pearl 8100/Globalsat BT-368i with OS 4.2.1. I have tested this with OS 4.5.0 (beta) and it DOES work there, but isn't a workable solution to require all my target customers to install a beta OS. Should be a simple test, could anyone spend 5 minutes and try this app out or lend some advice? Thanks!
Code:
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.system.*;
import javax.microedition.location.*;
import java.util.*;
public class GPSDemo extends UiApplication
{
private static int _interval = 30;
private static int _cnt = 0;
private EditField _status;
private Timer timer = null;
private final class GPSDemoScreen extends MainScreen
{
protected void makeMenu(Menu menu, int instance)
{
menu.add( _close );
menu.add(_background);
menu.addSeparator();
super.makeMenu(menu, instance);
}
public boolean onClose()
{
if (timer != null)
timer.cancel();
return super.onClose();
}
}
public static void main(String[] args)
{
new GPSDemo().enterEventDispatcher();
}
public GPSDemo()
{
GPSDemoScreen screen = new GPSDemoScreen();
screen.setTitle(new LabelField("GPS", LabelField.USE_ALL_WIDTH));
_status = new EditField();
screen.add(_status);
pushScreen(screen);
timer = new Timer();
timer.scheduleAtFixedRate(new GPSTask(),5000,60000);
}
private final class GPSTask extends TimerTask
{
public void run()
{
LocationProvider lp = null;
try {
Criteria cr = new Criteria();
lp = LocationProvider.getInstance(cr);
Location l = lp.getLocation(30);
if (l.isValid()) {
Coordinates c = l.getQualifiedCoordinates();
if ( c != null ) {
_cnt++;
updateLocationScreen("Got a fix: " + _cnt);
} else {
updateLocationScreen("Coords was null");
}
} else {
updateLocationScreen("location not valid");
}
}
catch (Exception e) {
updateLocationScreen("Failed: " + e.getMessage());
}
if (lp != null) {
lp.reset(); // Not sure if this is smart
lp = null;
}
}
}
private void updateLocationScreen(final String msg)
{
invokeLater(new Runnable() {
public void run()
{
_status.setText(msg);
short[] explodeAudio =
{
300, 50, 500, 50, 300, 50, 500, 50, 300, 50
};
if (Alert.isBuzzerSupported())
Alert.startBuzzer(explodeAudio, 100);
else if (Alert.isAudioSupported())
Alert.startAudio(explodeAudio,100);
}
});
}
private MenuItem _close = new MenuItem("Close", 0, 10) {
public void run()
{
System.exit(0);
}
};
private MenuItem _background = new MenuItem("Background", 1, 10) {
public void run()
{
requestBackground();
}
};
}