Using Google Maps in Android

Google Maps is one of the many applications bundled with the Android platform. In addition to simply using the Maps application, you can also embed it into your own applications and make it do some very cool things. In this article, I will show you how to use Google Maps in your Android applications and how to programmatically perform the following:

  1. Change the views of Google Maps
  2. Obtain the latitude and longitude of locations in Google Maps
  3. Perform geocoding and reverse geocoding
  4. Add markers to Google Maps

(Note: we cover Google Maps API v2 here.)

Creating the Project

Using Eclipse, create a new Android project and name GoogleMaps as shown in Figure 1.


Figure 1 Creating a new Android project using Eclipse

Obtaining a Maps API key

Beginning with the Android SDK release v1.0, you need to apply for a free Google Maps API key before you can integrate Google Maps into your Android application. To apply for a key, you need to follow the series of steps outlined below. You can also refer to Google’s detailed documentation on the process at http://code.google.com/android/toolbox/apis/mapkey.html.

First, if you are testing the application on the Android emulator, locate the SDK debug certificate located in the default folder of "C:Documents and SettingsLocal SettingsApplication DataAndroid". The filename of the debug keystore is debug.keystore. For deploying to a real Android device, substitute the debug.keystore file with your own keystore file. In a future article I will discuss how you can generate your own keystore file.

For simplicity, copy this file (debug.keystore) to a folder in C: (for example, create a folder called “C:Android“).

Using the debug keystore, you need to extract its MD5 fingerprint using the Keytool.exe application included with your JDK installation. This fingerprint is needed to apply for the free Google Maps key. You can usually find the Keytool.exe from the “C:Program FilesJavabin” folder.

Issue the following command (see also Figure 2) to extract the MD5 fingerprint.


keytool.exe -list -alias androiddebugkey -keystore "C:androiddebug.keystore" -storepass android -keypass android

Copy the MD5 certificate fingerprint and navigate your web browser to: http://code.google.com/android/maps-api-signup.html. Follow the instructions on the page to complete the application and obtain the Google Maps key.


Figure 2 Obtaining the MD5 fingerprint of the debug keystore

To use the Google Maps in your Android application, you need to modify your AndroidManifest.xml file by adding the element together with the INTERNET permission:

Displaying the Map

To display the Google Maps in your Android application, modify the main.xml file located in the res/layout folder. You shall use the element to display the Google Maps in your activity. In addition, let’s use the element to position the map within the activity:

Notice from above that I have used the Google Maps key that I obtained earlier and put it into the apiKey attribute.

In the MapsActivity.java file, modify the class to extend from the MapActivity class, instead of the normal Activity class:

Observe that if your class extends the MapActivity class, you need to override the isRouteDisplayed() method. You can simply do so by setting the method to return false.

That’s it! That’s all you need to do to display the Google Maps in your application. Press F11 in Eclipse to deploy the application onto an Android emulator. Figure 3 shows the Google map in all its glory.


Figure 3 Google Maps in your application

At this juncture, take note of a few troubleshooting details. If your program does not run (i.e. it crashes), then it is likely you forgot to put the following statement in your AndroidManifest.xml file:

If your application manages to load but you cannot see the map (all you see is a grid), then it is very likely you do not have a valid Map key, or that you did not specify the INTERNET permission:

Displaying the Zoom View

The previous section showed how you can display the Google Maps in your Android device. You can drag the map to any desired location and it will be updated on the fly. However, observe that there is no way to zoom in or out from a particular location. Thus, in this section, you will learn how you can let users zoom into or out of the map.

First, add a element to the main.xml file as shown below:

You will use the element to hold the two zoom controls in Google Maps (you will see this shortly).

In the MapsActivity.java file, add the following imports:

and add the following code after the line

The complete MapsActivity.java file is given below:

Basically, you obtain the MapView instance on the activity, obtain its zoom controls and then add it to the LinearLayout element you added to the activity earlier on. In the above case, the zoom control will be displayed at the bottom of the screen. When you now press F11 in Eclipse, you will see the zoom controls when you touch the map (see Figure 4).


Figure 4 Using the zoom controls in Google Maps

Using the zoom control, you can zoom in or out of a location by simply touching the “+ or “-” buttons on the screen.

Alternatively, you can also programmatically zoom in or out of the map using the zoomIn() and zoomOut() methods from the MapController class:

In the above code, when the user presses the number 3 on the keyboard the map will zoom in into the next level. Pressing number 1 will zoom out one level.

Changing Views of the Map

By default, the Google Maps displays in the map mode. If you wish to display the map in satellite view, you can use the setSatellite() method of the MapView class, like this:

You can also display the map in street view, using the setStreetView() method:

Figure 5 shows the Google Maps displayed in satellite and street views, respectively.


Figure 5 Displaying Google Maps in satellite and street views

Displaying a Particular Location

Be default, the Google Maps displays the map of the United States when it is first loaded. However, you can also set the Google Maps to display a particular location. In this case, you can use the animateTo() method of the MapController class.

The following code shows how this is done:

In the above code, you first obtain a controller from the MapView instance and assign it to a MapController object (mc). You use a GeoPoint object to represent a geographical location. Note that for this class the latitude and longitude of a location are represented in micro degrees. This means that they are stored as integer values. For a latitude value of 40.747778, you need to multiply it by 1e6 to obtain 40747778.

To navigate the map to a particular location, you can use the animateTo() method of the MapController class (an instance which is obtained from the MapView object). The setZoom() method allows you to specify the zoom level in which the map is displayed. Figure 6 shows the Google Maps displaying the map of Singapore.


Figure 6 Navigating to a particular location on the map

Adding Markers

Very often, you may wish to add markers to the map to indicate places of interests. Let’s see how you can do this in Android. First, create a GIF image containing a pushpin (see Figure 7) and copy it into the res/drawable folder of the project. For best effect, you should make the background of the image transparent so that it does not block off parts of the map when the image is added to the map.


Figure 7 Adding an image to the res/drawable folder

To add a marker to the map, you first need to define a class that extends the Overlay class:

In the MapOverlay class that you have defined, override the draw() method so that you can draw the pushpin image on the map. In particular, note that you need to translate the geographical location (represented by a GeoPoint object, p) into screen coordinates.

As you want the pointed tip of the push pin to indicate the position of the location, you would need to deduct the height of the image (which is 50 pixels) from the y-coordinate of the point (see Figure 8) and draw the image at that location.


Figure 8 Adding an image to the map

To add the marker, create an instance of the MapOverlap class and add it to the list of overlays available on the MapView object:

Figure 9 shows how the pushpin looks like when added to the map.


Figure 9 Adding a marker to the map

Getting the Location that was touched

After using Google Maps for a while, you may wish to know the latitude and longitude of a location corresponding to the position on the screen that you have just touched. Knowing this information is very useful as you can find out the address of a location, a process known as Geocoding (you will see how this is done in the next section).

If you have added an overlay to the map, you can override the onTouchEvent() method within the Overlay class. This method is fired every time the user touches the map. This method has two parameters – MotionEvent and MapView. Using the MotionEvent parameter, you can know if the user has lifted his finger from the screen using the getAction() method. In the following code, if the user has touched and then lifted his finger, you will display the latitude and longitude of the location touched:

Figure 10 shows this in action.


Figure 10 Displaying the latitude and longitude of a point touched on the map

Geocoding and Reverse Geocoding

If you know the latitude and longitude of a location, you can find out its address using a process known as Geocoding. Google Maps in Android supports this via the Geocoder class. The following code shows how you can find out the address of a location you have just touched using the getFromLocation() method:

Figure 11 shows the above code in action.


Figure 11 Performing Geocoding in Google Maps

If you know the address of a location but want to know its latitude and longitude, you can do so via reverse-Geocoding. Again, you can use the Geocoder class for this purpose. The following code shows how you can find the exact location of the Empire State Building by using the getFromLocationName() method:

Once the location is found, the above code navigates the map to the location. Figure 12 shows the code in action.


Figure 12 Navigating to the Empire State Building

Summary

In this article, you have learnt a few tricks for the Google Maps in Android. Using Google Maps, there are many interesting projects you can work on, such as geo-tagging, geo-tracking, etc. If you have cool ideas on building cool location-based services, share with us in the comments box below. Have fun!

70 Comments

  • aramsvivek says:

    Thanks….The tutorial is simply good.It works fine.

    For Android1.5(Developers):

    Just Create avd for google API(Android1.5)….

  • LifeF says:

    i saw my home from HCMC, thanks u very much, mr Lee, :))!

  • cawa says:

    many thanks for the tutorial,
    but I have a little more question for you: [b]can I change the pin position just by touching the screen?[/b]

    the new position will correspond to the point on the screen that I have just touched.

    i tried the code:

    class MapOverlay extends com.google.android.maps.Overlay {
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
    super.draw(canvas, mapView, shadow);

    Point screenPts = new Point();
    mapView.getProjection().toPixels(p, screenPts);

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pin);
    canvas.drawBitmap(bmp, screenPts.x, screenPts.y-48, null);
    return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {
    if (event.getAction() == 1) {
    GeoPoint p = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());

    [b]mc.animateTo(p);

    MapOverlay mapOverlay = new MapOverlay();
    listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(mapOverlay);[/b]

    return true;
    } else return false;
    }
    }

    but nothing happened: while the map is mooving its center on the new coord, the pin still remain in the initial position.

    could you please help me?
    thanks!

  • zxy861114 says:

    hi CAWA,
    The code can achieve your aim.
    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {
    if (event.getAction() == 1) {
    p = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
    mc.animateTo(p);
    return true;
    } else return false;
    }

    In your code ,remove the GeoPoint.You can see the draw function.It draw the canvas with p[mapView.getProjection().toPixels(p, screenPts);]. Also remove MapOverlay .It is not necessary.In its overlay list,it have the MapOverlay.

  • sing522 says:

    3Q~~~
    ^_^

  • msalmanq says:

    One of the best tutorial, I have found on the internet for using Google Maps on Android OS.
    Salman

  • jhm15217 says:

    I’ve noticed at least one app, PlaceFinder, feeding an http string to the map applicatoin. How does that work?

  • jhm15217 says:

    For example, feeding
    http://maps.google.com/maps?saddr=1788+Oak+Creek+Dr+94304+to:1600+Amphitheatre+Parkway+94043
    to the browser gets me directions, but feeding it as part of an Android intent causes the maps app enter direction-finding mode but it misses the “to:” part.

    So whoever is parsing the url for my Android app is out of sync with the web service.

  • aamiryaseen says:

    Great Article,
    I am having two problem when implementing my Android Map based application, can you help?
    1- How can I zoom map, so that all the added overlays are visible?
    2- how can I show information in bubble, when use select one of the added overlay (in this case icon).?

    Thanks,
    Aamir

  • mrSimons says:

    Thanks Wei Meng your tutorials are a real gem!

  • ruadhan says:

    If you can’t find the debug.keystore file located in the default location mentioned in the article, look in the C:\Documents and Settings\\.android folder

  • vt515 says:

    Wei Meng,

    I’m getting this error message when tired to follow the steps of this tutorial.

    Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY

    The map will not load. I am using Eclipse with the Android Plugin.

    Thank you for your time,
    James

  • sam82t says:

    Hello ,
    I have followed all the new instructions preoperly but I am not able to see the Map, only the grids are visible.
    Any solution fo this problem

    Sam

  • rd42 says:

    Thanks for sharing the code.
    I’m stumped. I’m using Eclipse and I copied and pasted the AndroidManifest directly into mine and it won’t compile because the [code][/code] tag at the end says, it’s missing its’ start tag and there is a start tag.

    Any ideas?

    Here’s my manifest:
    [code]













    [/code]

  • avdhesh says:

    Hi,

    Thanks for such a good article on maps. I found one issue in your block related to debug certificate on given location [b]C:\Documents and Settings\\Local Settings\Application Data\Android[/b]. When a generate the finger for specified location, after generating finger pint, i generate the api key. My app is running fine but i am not able to see any maps on emulator only grid view are there.

    My problem is resolved when i get the debug key store on the given location:
    [b] C:\Documents and Settings\\.android\debug.keystore[/b]

    Debug key store location on different operating systems.

    ➤ Windows Vista \users\\.android\debug.keystore
    ➤ Windows XP \Documents and Settings\
    \.android\debug.keystore
    ➤ Linux or Mac ∼/.android/debug.keystore

    Hope this will help.

    Thanks
    Avdhesh

  • cnbishop says:

    thanks for a great tutorial! i was wondering, how can i add an additional marker to the spot when the user touches the map?

  • tripple60 says:

    Hello, I would like to use your great example on using google maps in android to learn and explore how the code works in eclipse with the JDK. Could you email me the source code on this so I can begin experimenting? Much appreciated. tripple60@gmail.com

    Matt

  • gaurid3 says:

    Hi, I got the debug key for my application. I have added INTERNET permission too. The app loads but doesn’t show the map in emulator. What can be the reason? Does it work behind proxy?

  • vivekasohan says:

    good sample ya i got everything correctly

Exclusive tips, how-tos, news and comment

Receive monthly updates on the world of mobile dev.

Other Products

Market leading device intelligence for the web, app and MNO ecosystems
DeviceAtlas - Device Intelligence

Real-time identification of fraudulent and misrepresented traffic
DeviceAssure - Device Verification

A free tool for developers, designers and marketers to test website performance
mobiReady - Evaluate your websites’ mobile readiness

© 2024 DeviceAtlas Limited. All rights reserved.

This is a website of DeviceAtlas Limited, a private company limited by shares, incorporated and registered in the Republic of Ireland with registered number 398040 and registered office at 6th Floor, 2 Grand Canal Square, Dublin 2, Ireland