I’m beginning to like coding in Blackberry since now an official JDE for Mac is available. Then I decided to have a look and prepare myself for some rather annoying but pleasant surprise from Blackberry’s JDE. To be honest, I don’t like Blackberry’s behavior of complicating simple things. But then I learned a lot from the codes.
Urbanesia is a location based service and therefore location is very important. I’ve been trying out a few ways to get the device’s location and after all the things I’ve tried, I resorted into plain GMM solution. Blackberry’s location API was too slow to get a fix on the device’s location. Nevertheless, the codes are included as well.
The codes should work well from Blackberry OS 5.0 upwards. Haven’t tried with older OS. You might want to wrap calling the methods inside a Thread so it won’t block the UI. My 2 cents about Threading in Blackberry, extend the Thread class, makes life easier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | package com.urbanesia.api; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import javax.microedition.location.Criteria; import javax.microedition.location.Location; import javax.microedition.location.LocationException; import javax.microedition.location.LocationProvider; import net.rim.device.api.system.GPRSInfo; import com.urbanesia.utils.Log; public class CellTowerLocation { protected static final int LOOKUP_TIMEOUT = 5000; protected static final int LOOKUP_TOLERANCE = 500; public static final boolean FORCE_LOCATION_UPDATE = true; public static final boolean DONT_FORCE_LOCATION_UPDATE = false; public static String getLocation() { Criteria ct = new Criteria(); ct.setHorizontalAccuracy(1000); ct.setVerticalAccuracy(1000); ct.setCostAllowed(true); ct.setPreferredResponseTime(LOOKUP_TIMEOUT); ct.setPreferredPowerConsumption(Criteria.POWER_USAGE_LOW); String coords = ""; try { LocationProvider lp = LocationProvider.getInstance(ct); Location loc = lp.getLocation(LOOKUP_TIMEOUT + LOOKUP_TOLERANCE); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; Log.out("Coordinates - Exact Location: " + coords); } catch (LocationException e) { Location loc = LocationProvider.getLastKnownLocation(); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; Log.out("Coordinates - Using last known location: " + coords); } catch (InterruptedException e) { Location loc = LocationProvider.getLastKnownLocation(); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; Log.out("Coordinates - Using last known location: " + coords); } Log.out("Coordinates: " + coords); return coords; } public static String getLocation(boolean force) { if(force) { Criteria ct = new Criteria(); ct.setHorizontalAccuracy(1000); ct.setVerticalAccuracy(1000); ct.setCostAllowed(true); ct.setPreferredResponseTime(LOOKUP_TIMEOUT); ct.setPreferredPowerConsumption(Criteria.POWER_USAGE_LOW); String coords = ""; try { LocationProvider lp = LocationProvider.getInstance(ct); Location loc = lp.getLocation(-1); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; } catch (Exception e) { Location loc = LocationProvider.getLastKnownLocation(); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; } Log.out("Coordinates: " + coords); return coords; } else { return getLocation(); } } public static String getLocationGMM() { String coords = "0,0"; int cellID = GPRSInfo.getCellInfo().getCellId(); int lac = GPRSInfo.getCellInfo().getLAC(); String urlString = "http://www.google.com/glm/mmap" + ConnString.getConnectionString(); try { HttpConnection conn = (HttpConnection) Connector.open(urlString); OutputStream os = null; InputStream in = null; conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setRequestProperty("If-Modified-Since","29 Oct 1999 19:43:31 GMT"); conn.setRequestProperty("User-Agent","Urbanesia Jajan Blackberry v1.0"); conn.setRequestProperty("Content-Language", "en-US"); os = conn.openOutputStream(); WriteData(os, cellID, lac); in = conn.openInputStream(); DataInputStream dataInputStream = new DataInputStream(in); dataInputStream.readShort(); dataInputStream.readByte(); int code = dataInputStream.readInt(); if (code == 0) { double lat = (double) dataInputStream.readInt() / 1000000D; double lng = (double) dataInputStream.readInt() / 1000000D; dataInputStream.readInt(); dataInputStream.readInt(); dataInputStream.readUTF(); coords = Double.toString(lat) + "," + Double.toString(lng); Log.out("Coordinates - Got from GMM: " + coords); } else { Location loc = LocationProvider.getLastKnownLocation(); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; Log.out("Coordinates - Using last known location: " + coords); } } catch (Exception e) { Location loc = LocationProvider.getLastKnownLocation(); String lat = String.valueOf(loc.getQualifiedCoordinates().getLatitude()); String lon = String.valueOf(loc.getQualifiedCoordinates().getLongitude()); coords = lat+","+lon; Log.out("Coordinates - Using last known location: " + coords); } return coords; } private static void WriteData(OutputStream out, int cellID, int lac) throws IOException { DataOutputStream dataOutputStream = new DataOutputStream(out); dataOutputStream.writeShort(21); dataOutputStream.writeLong(0); dataOutputStream.writeUTF("en"); dataOutputStream.writeUTF("Android"); dataOutputStream.writeUTF("1.0"); dataOutputStream.writeUTF("Web"); dataOutputStream.writeByte(27); dataOutputStream.writeInt(0); dataOutputStream.writeInt(0); dataOutputStream.writeInt(3); dataOutputStream.writeUTF(""); dataOutputStream.writeInt(cellID); dataOutputStream.writeInt(lac); dataOutputStream.writeInt(0); dataOutputStream.writeInt(0); dataOutputStream.writeInt(0); dataOutputStream.writeInt(0); dataOutputStream.flush(); } } |
Discussions
base station, blackberry, cell tower, cid, gps, jde, lac, lbs, location, location base, location based, Mac, urbanesia