Carme GPS Tracker for Android

My frist Android app, this is simple GPS tracker program that let us record our tracks, store  and share them.

This project uses my custom TabWidget for Android.

Main features

  • Record
  • Playback
  • Share via Email (Google Earth)
  • Share via Twitter  (in progress)
  • Exporting to SD Card
  • Tagging (in progress)

I use icon from , love their methodology give the little guys an edge by providing free high quality designs.


[nggallery id=2]

To Come

Here are some other features that I will implement soon

  • Altitude profiler
  • Photos
  • Profiles

Download Carme source code

11 thoughts on “Carme GPS Tracker for Android”

  1. Greg, hi ,

    I ran into your blog looking for “simple gps tracker”

    Any chance i could use the code you’ve created for a reference ?

    I’m a uni student looking to do a tracker app with additional stuff in it, like matching my call-log to geo-locations.

    Hope you say yes.
    I’m at


  2. Hey,
    You posted you will have the code hosted here…
    can i use the code?
    when will you post it??
    i realy need to see the tab widget and the gps playback…

    Thank you for gr8 Blog

    1. I will clean it up and post it on Monday, also I have created a demo project for the TabWidget which also will be posted Monday. BTW what Android SDK are you using?

  3. Hi, im very interested in the source code too as i require them in my application. Please post it up asap.


  4. Hi,

    I am very interested in seeing example source code for your TabWidget component. If you are not willing to release the whole Carme GPS Tracker source, could you give a fuller example of using TabWidget?

    Thanks 🙂

  5. Hello
    if you have an idea that can help me I would be grateful
    So i should create a web service wich will communicate with my android application .in my android app the client choose two point start and arrival this two point will be send to my web service to find the bus that has the shortest path between them. i have a probleme in web service side I try to use Dijkstra’s algorithm to find the shortest path between two points. to test the Dijkstra algorithm I must extract data from a mysql database and not put it right into my algorithm.but i dont Khnow how can i do it . secondly I do not know exactly what are the classes and functions that I need to do this web service.
    in my database I have two table that contains the bus route (bus num), code (station id), pt_arret (station name). and another table which contains location code (id station), latitude and longitude, and distance (is the distance between a station and the station which precedes.
    (im sorry for the mistacke of spelling because i don’t speak english very fluently)
    thanks in advance

    1. Hello this is how I clean up my data before converting it to a xml document.

      This is static entity map, you might not have to use this if don’t need to.

      entityMap.put("nbsp", " ");
      entityMap.put("iexcl", "¡");
      entityMap.put("cent", "¢");
      entityMap.put("pound", "£");
      entityMap.put("curren", "¤");
      entityMap.put("yen", "¥");
      entityMap.put("brvbar", "¦");
      entityMap.put("sect", "§");
      entityMap.put("uml", "¨");
      entityMap.put("copy", "©");
      entityMap.put("ordf", "ª");
      entityMap.put("laquo", "«");
      entityMap.put("not", "¬");
      entityMap.put("shy", "­");
      entityMap.put("reg", "®");
      entityMap.put("macr", "¯");
      entityMap.put("deg", "°");
      entityMap.put("plusmn", "±");
      entityMap.put("sup2", "²");
      entityMap.put("sup3", "³");
      entityMap.put("acute", "´");
      entityMap.put("micro", "µ");
      entityMap.put("para", "¶");
      entityMap.put("middot", "·");
      entityMap.put("cedil", "¸");
      entityMap.put("sup1", "¹");
      entityMap.put("ordm", "º");
      entityMap.put("raquo", "»");
      entityMap.put("frac14", "¼");
      entityMap.put("frac12", "½");
      entityMap.put("frac34", "¾");
      entityMap.put("iquest", "¿");
      entityMap.put("Agrave", "À");
      entityMap.put("Aacute", "Á");
      entityMap.put("Acirc", "Â");
      entityMap.put("Atilde", "Ã");
      entityMap.put("Auml", "Ä");
      entityMap.put("Aring", "Å");
      entityMap.put("AElig", "Æ");
      entityMap.put("Ccedil", "Ç");
      entityMap.put("Egrave", "È");
      entityMap.put("Eacute", "É");
      entityMap.put("Ecirc", "Ê");
      entityMap.put("Euml", "Ë");
      entityMap.put("Igrave", "Ì");
      entityMap.put("Iacute", "Í");
      entityMap.put("Icirc", "Î");
      entityMap.put("Iuml", "Ï");
      entityMap.put("ETH", "Ð");
      entityMap.put("Ntilde", "Ñ");
      entityMap.put("Ograve", "Ò");
      entityMap.put("Oacute", "Ó");
      entityMap.put("Ocirc", "Ô");
      entityMap.put("Otilde", "Õ");
      entityMap.put("Ouml", "Ö");
      entityMap.put("times", "×");
      entityMap.put("Oslash", "Ø");
      entityMap.put("Ugrave", "Ù");
      entityMap.put("Uacute", "Ú");
      entityMap.put("Ucirc", "Û");
      entityMap.put("Uuml", "Ü");
      entityMap.put("Yacute", "Ý");
      entityMap.put("THORN", "Þ");
      entityMap.put("szlig", "ß");
      entityMap.put("agrave", "à");
      entityMap.put("aacute", "á");
      entityMap.put("acirc", "â");
      entityMap.put("atilde", "ã");
      entityMap.put("auml", "ä");
      entityMap.put("aring", "å");
      entityMap.put("aelig", "æ");
      entityMap.put("ccedil", "ç");
      entityMap.put("egrave", "è");
      entityMap.put("eacute", "é");
      entityMap.put("ecirc", "ê");
      entityMap.put("euml", "ë");
      entityMap.put("igrave", "ì");
      entityMap.put("iacute", "í");
      entityMap.put("icirc", "î");
      entityMap.put("iuml", "ï");
      entityMap.put("eth", "ð");
      entityMap.put("ntilde", "ñ");
      entityMap.put("ograve", "ò");
      entityMap.put("oacute", "ó");
      entityMap.put("ocirc", "ô");
      entityMap.put("otilde", "õ");
      entityMap.put("ouml", "ö");
      entityMap.put("divide", "÷");
      entityMap.put("oslash", "ø");
      entityMap.put("ugrave", "ù");
      entityMap.put("uacute", "ú");
      entityMap.put("ucirc", "û");
      entityMap.put("uuml", "ü");
      entityMap.put("yacute", "ý");
      entityMap.put("thorn", "þ");
      entityMap.put("yuml", "ÿ");
      entityMap.put("fnof", "À");
      entityMap.put("Alpha", "Α");
      entityMap.put("Beta", "Β");
      entityMap.put("Gamma", "Γ");
      entityMap.put("Delta", "Δ");
      entityMap.put("Epsilon", "Ε");
      entityMap.put("Zeta", "Ζ");
      entityMap.put("Eta", "Η");
      entityMap.put("Theta", "Θ");
      entityMap.put("Iota", "Ι");
      entityMap.put("Kappa", "Κ");
      entityMap.put("Lambda", "Λ");
      entityMap.put("Mu", "Μ");
      entityMap.put("Nu", "Ν");
      entityMap.put("Xi", "Ξ");
      entityMap.put("Omicron", "Ο");
      entityMap.put("Pi", "Π");
      entityMap.put("Rho", "Ρ");
      entityMap.put("Sigma", "Σ");
      entityMap.put("Tau", "Τ");
      entityMap.put("Upsi", "Υ");
      entityMap.put("Phi", "Φ");
      entityMap.put("Chi", "Χ");
      entityMap.put("Psi", "Ψ");
      entityMap.put("Omega", "Ω");
      entityMap.put("alpha", "α");
      entityMap.put("beta", "β");
      entityMap.put("gamma", "γ");
      entityMap.put("delta", "δ");
      entityMap.put("epsi", "ε");
      entityMap.put("zeta", "ζ");
      entityMap.put("eta", "η");
      entityMap.put("theta", "θ");
      entityMap.put("iota", "ι");
      entityMap.put("kappa", "κ");
      entityMap.put("lambda", "λ");
      entityMap.put("mu", "μ");
      entityMap.put("nu", "ν");
      entityMap.put("xi", "ξ");
      entityMap.put("omicron", "ο");
      entityMap.put("pi", "π");
      entityMap.put("rho", "ρ");
      entityMap.put("sigmaf", "ς");
      entityMap.put("sigma", "σ");
      entityMap.put("tau", "τ");
      entityMap.put("upsi", "υ");
      entityMap.put("phi", "φ");
      entityMap.put("chi", "χ");
      entityMap.put("psi", "ψ");
      entityMap.put("omega", "ω");
      entityMap.put("theta", "ϑ");
      entityMap.put("upsih", "ϒ");
      entityMap.put("piv", "ϖ");
      entityMap.put("bull", "•");
      entityMap.put("hellip", "…");
      entityMap.put("prime", "′");
      entityMap.put("Prime", "″");
      entityMap.put("oline", "‾");
      entityMap.put("frasl", "⁄");
      entityMap.put("weierp", "℘");
      entityMap.put("image", "ℑ");
      entityMap.put("real", "ℜ");
      entityMap.put("trade", "™");
      entityMap.put("alefsym", "ℵ");
      entityMap.put("larr", "←");
      entityMap.put("uarr", "↑");
      entityMap.put("rarr", "→");
      entityMap.put("darr", "↓");
      entityMap.put("harr", "↔");
      entityMap.put("crarr", "↵");
      entityMap.put("lArr", "⇐");
      entityMap.put("uArr", "⇑");
      entityMap.put("rArr", "⇒");
      entityMap.put("dArr", "⇓");
      entityMap.put("hArr", "⇔");
      entityMap.put("forall", "∀");
      entityMap.put("part", "∂");
      entityMap.put("exist", "∃");
      entityMap.put("empty", "∅");
      entityMap.put("nabla", "∇");
      entityMap.put("isin", "∈");
      entityMap.put("notin", "∉");
      entityMap.put("ni", "∋");
      entityMap.put("prod", "∏");
      entityMap.put("sum", "−");
      entityMap.put("minus", "−");
      entityMap.put("lowast", "∗");
      entityMap.put("radic", "√");
      entityMap.put("prop", "∝");
      entityMap.put("infin", "∞");
      entityMap.put("ang", "∠");
      entityMap.put("and", "⊥");
      entityMap.put("or", "⊦");
      entityMap.put("cap", "∩");
      entityMap.put("cup", "∪");
      entityMap.put("int", "∫");
      entityMap.put("there4", "∴");
      entityMap.put("sim", "∼");
      entityMap.put("cong", "≅");
      entityMap.put("asymp", "≅");
      entityMap.put("ne", "≠");
      entityMap.put("equiv", "≡");
      entityMap.put("le", "≤");
      entityMap.put("ge", "≥");
      entityMap.put("sub", "⊂");
      entityMap.put("sup", "⊃");

      entityMap.put("nsub", "⊄");
      entityMap.put("sube", "⊆");
      entityMap.put("supe", "⊇");
      entityMap.put("oplus", "⊕");
      entityMap.put("otimes", "⊗");
      entityMap.put("perp", "⊥");
      entityMap.put("sdot", "⋅");

      entityMap.put("lceil", "⌈");
      entityMap.put("rceil", "⌉");
      entityMap.put("lfloor", "⌊");
      entityMap.put("rfloor", "⌋");
      entityMap.put("lang", "〈");

      entityMap.put("loz", "◊");

      entityMap.put("spades", "♠");
      entityMap.put("clubs", "♣");
      entityMap.put("hearts", "♥");
      entityMap.put("diams", "♦");

      entityMap.put("quot", """);
      entityMap.put("amp", "&");
      entityMap.put("lt", "<");
      entityMap.put("gt", ">");

      entityMap.put("OElig", "Œ");
      entityMap.put("oelig", "œ");
      entityMap.put("Scaron", "Š");
      entityMap.put("scaron", "š");
      entityMap.put("Yuml", "Ÿ");

      entityMap.put("circ", "ˆ");
      entityMap.put("tilde", "˜");

      entityMap.put("ensp", " ");
      entityMap.put("emsp", " ");
      entityMap.put("thinsp", " ");
      entityMap.put("zwnj", "‌");
      entityMap.put("zwj", "‍");
      entityMap.put("lrm", "‎");
      entityMap.put("rlm", "‏");
      entityMap.put("ndash", "–");
      entityMap.put("mdash", "—");
      entityMap.put("lsquo", "‘");
      entityMap.put("rsquo", "’");
      entityMap.put("sbquo", "‚");
      entityMap.put("ldquo", "“");
      entityMap.put("rdquo", "”");
      entityMap.put("bdquo", "„");
      entityMap.put("dagger", "†");
      entityMap.put("Dagger", "‡");
      entityMap.put("permil", "‰");
      entityMap.put("lsaquo", "‹");
      entityMap.put("rsaquo", "›");

      Code that does the actual cleanup

      String convertedData = writer.getBuffer().toString();

      // This is to prevent 'org.xml.sax.SAXParseException: Already seen
      // doctype.' exception
      // //
      convertedData = convertedData.replaceAll("", "");

      // TODO : Clean up using : and
      StringBuffer buffer = new StringBuffer();
      buffer.append(" " + " > iterator = entityMap.entrySet().iterator();
      while (iterator.hasNext()) {
      Entry entry =;
      buffer.append(" ]>");

      convertedData = buffer.toString();

Leave a Comment

Your email address will not be published. Required fields are marked *