Biofan4u
Thú CƯng :
Số bài viết : 20 Điểm : 28 Được cảm ơn : 0 Ngày sinh : 21/11/1983 Tham gia ngày : 24/09/2010 Tuổi : 41 Đến từ : Java Land
| Tiêu đề: Google Map and GPS for Mobile ! 8/4/2011, 09:43 | |
| Code JavaME về Google Map và GPS. Phần mềm này chạy trên nền tảng Java MIDP 2.0 và CDLC 1.1 .Các bạn chỉ việc lên website của Java down về bộ công cụ Java ME .Cài đặt xong xuôi chạy chương trình và tạo 2 class JMidlet.java (Class main sử dụng để hiển thị trên màn hình thiết bị di động) - Code:
-
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.io.IOException; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.location.*;
/** * @author Mr.Trinh */ public class JMidlet extends MIDlet implements CommandListener,LocationListener{ private double lat,lon; private LocationProvider locationProvider; private Criteria cr; private Location location; private Coordinates coordinates; private Command exitCommand,refreshCommand; // The exit command private Display display; // The display for this MIDlet private Form mForm; // The main form to display private Image map; private ImageItem GGmap;
public JMidlet (){ display = Display.getDisplay(this); exitCommand = new Command("Exit", Command.EXIT, 0); refreshCommand = new Command("Refresh", Command.OK, 1); } public void startApp() { mForm = new Form("Google Maps"); mForm.addCommand(exitCommand); mForm.addCommand(refreshCommand); mForm.setCommandListener(this); display.setCurrent(mForm); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable d) { if (c == exitCommand) { destroyApp(false); notifyDestroyed(); } if(c== refreshCommand){ cr = new Criteria(); cr.setHorizontalAccuracy(500); try { locationProvider = LocationProvider.getInstance(cr); } catch (LocationException ex) { ex.printStackTrace(); } try { location = locationProvider.getLocation(40); } catch (InterruptedException ex) { ex.printStackTrace(); } catch (LocationException ex) { ex.printStackTrace(); } coordinates =location.getQualifiedCoordinates(); lat = coordinates.getLatitude(); lon = coordinates.getLongitude(); GoogleMaps gMap = new GoogleMaps("API_KEY"); try { map = gMap.retrieveStaticImage(340,240,lat,lon, 14, "satellite","jpg"); } catch (IOException ex) { ex.printStackTrace(); } GGmap = new ImageItem(null,map,ImageItem.LAYOUT_CENTER,null); mForm.deleteAll(); mForm.append(GGmap); display.setCurrent(mForm); } }
public void locationUpdated(LocationProvider arg0, Location arg1) { throw new UnsupportedOperationException("Not supported yet."); }
public void providerStateChanged(LocationProvider arg0, int arg1) { throw new UnsupportedOperationException("Not supported yet."); } }
Tiếp theo tạo thêm 1 class Java: GoogleMaps.java - Code:
-
import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Vector; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import javax.microedition.lcdui.Image;
public class GoogleMaps { private static final String URL_UNRESERVED = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-_.~"; private static final char[] HEX = "0123456789ABCDEF".toCharArray();
// these 2 properties will be used with map scrolling methods. You can remove them if not needed public static final int offset = 268435456; public static final double radius = offset / Math.PI;
private String apiKey = null; public GoogleMaps(String key) { apiKey = key; }
public double[] geocodeAddress(String address) throws Exception { byte[] res = loadHttpFile(getGeocodeUrl(address)); String[] data = split(new String(res), ',');
if (!data[0].equals("200")) { int errorCode = Integer.parseInt(data[0]); throw new Exception("Google Maps Exception: " + getGeocodeError(errorCode)); }
return new double[] { Double.parseDouble(data[2]), Double.parseDouble(data[3]) }; }
public Image retrieveStaticImage(int width, int height, double lat, double lng, int zoom,String maptype, String format) throws IOException { byte[] imageData = loadHttpFile(getMapUrl(width, height, lng, lat, zoom, maptype, format));
return Image.createImage(imageData, 0, imageData.length); }
private static String getGeocodeError(int errorCode) { switch (errorCode) { case 400: return "Bad request"; case 500: return "Server error"; case 601: return "Missing query"; case 602: return "Unknown address"; case 603: return "Unavailable address"; case 604: return "Unknown directions"; case 610: return "Bad API key"; case 620: return "Too many queries"; default: return "Generic error"; } }
private String getGeocodeUrl(String address) { return "http://maps.google.com/maps/geo?q=" + urlEncode(address) + "&output=csv&key=" + apiKey; }
private String getMapUrl(int width, int height, double lng, double lat, int zoom, String maptype,String format) { return "http://maps.google.com/staticmap?center=" + lat + "," + lng + "&maptype=" + maptype+"&format="+ format + "&zoom=" + zoom + "&size=" + width + "x" + height + "&key=" + apiKey; }
private static String urlEncode(String str) { StringBuffer buf = new StringBuffer(); byte[] bytes = null; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeUTF(str); bytes = bos.toByteArray(); } catch (IOException e) { // ignore } for (int i = 2; i < bytes.length; i++) { byte b = bytes[i]; if (URL_UNRESERVED.indexOf(b) >= 0) { buf.append((char) b); } else { buf.append('%').append(HEX[(b >> 4) & 0x0f]).append(HEX[b & 0x0f]); } } return buf.toString(); }
private static byte[] loadHttpFile(String url) throws IOException { byte[] byteBuffer;
HttpConnection hc = (HttpConnection) Connector.open(url); try { hc.setRequestMethod(HttpConnection.GET); InputStream is = hc.openInputStream(); try { int len = (int) hc.getLength(); if (len > 0) { byteBuffer = new byte[len]; int done = 0; while (done < len) { done += is.read(byteBuffer, done, len - done); } } else { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[512]; int count; while ( (count = is.read(buffer)) >= 0 ) { bos.write(buffer, 0, count); } byteBuffer = bos.toByteArray(); } } finally { is.close(); } } finally { hc.close(); }
return byteBuffer; }
private static String[] split(String s, int chr) { Vector res = new Vector();
int curr; int prev = 0;
while ( (curr = s.indexOf(chr, prev)) >= 0 ) { res.addElement(s.substring(prev, curr)); prev = curr + 1; } res.addElement(s.substring(prev));
String[] splitted = new String[res.size()]; res.copyInto(splitted);
return splitted; } }
Chạy chương trình và test trên mobile |
|
Biofan4u
Thú CƯng :
Số bài viết : 20 Điểm : 28 Được cảm ơn : 0 Ngày sinh : 21/11/1983 Tham gia ngày : 24/09/2010 Tuổi : 41 Đến từ : Java Land
| Tiêu đề: Re: Google Map and GPS for Mobile ! 8/4/2011, 09:48 | |
| Up thêm tý nữa ! một số trang web tham khảo về GPS và Google map: 1) Định đạnh dữ liệu trả về từ GPS: [You must be registered and logged in to see this link.]2) Định dạng URL để nhận một Static Map (Google Map): [You must be registered and logged in to see this link.]3) Gói nhận và bắt tín hiệu GPS trên Java [You must be registered and logged in to see this link.] |
|