Android Tutorial (old) Google Maps Android v2 tutorial

Status
Not open for further replies.
If you are using B4A v5.80+ then please follow this tutorial: https://www.b4x.com/android/forum/threads/google-maps.63930/#post-404386

GoogleMaps library requires v2.50 or above.

GoogleMaps library allows you to add Google maps to your application. This library requires Android 3+ and will only work on devices with Google Play service.

This tutorial will cover the configuration steps required for showing a map.

1. Download Google Play services - From the IDE choose Run AVD Manager and then choose Tools - SDK Manager. Select Google Play services under the Extras node and install it:

SS-2012-12-18_18.28.04.png


2. Copy google-play-services.jar to the libraries folder - This file is available under:
C:\<android sdk>\extras\google\google_play_services\libproject\google-play-services_lib\libs (ignore the extra space that the forum script insists on adding)
You should copy it to the libraries folder.

2.5. Download the attached library, unzip it and copy to the libraries folder.

3. Find the key signature - Your application must be signed with a private key other than the debug key. After you select a new or existing key file (Tools - Private Sign Key) you should reopen the private key dialog. The signature information will be displayed (increase the dialog size as needed).
The value after SHA1 is required for the next step:

SS-2012-12-18_18.11.34.png


4. Create an API project - Follow these steps and create an API project.
You should follow the steps under "Creating an API Project" and "Obtaining an API key".

Tips:
- Make sure to select "Google Maps Android API v2" in the services list and not one of the other similar services.
- Under "Simple API Access" you should select "Key for Android apps (with certificates".

5. Add the following code to the manifest editor:
B4X:
AddManifestText( <permission
          android:name="$PACKAGE$.permission.MAPS_RECEIVE"
          android:protectionLevel="signature"/>
      <uses-feature android:glEsVersion="0x00020000" android:required="true"/>)

AddApplicationText(<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyCzspmxxxxxxxxxxxxx"/>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"
    />)
AddPermission(android.permission.ACCESS_NETWORK_STATE)
You should replace the value after android:value with the key you received in the previous step.

6. Add an #AdditionalRes attribute to the main activity:

You should add a reference to Google play resources by adding the following line:
B4X:
#AdditionalRes: <google-play-services res folder>, com.google.android.gms
For example:

#AdditionalRes: C:\android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib\res, com.google.android.gms

Run the following code:
B4X:
'Activity module
Sub Process_Globals

End Sub

Sub Globals
   Dim mFragment As MapFragment
   Dim gmap As GoogleMap
   Dim MapPanel As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
   MapPanel.Initialize("")
   Activity.AddView(MapPanel, 0, 0, 100%x, 100%y)
   If mFragment.IsGooglePlayServicesAvailable = False Then
      ToastMessageShow("Google Play services not available.", True)
   Else
      mFragment.Initialize("Map", MapPanel)
   End If
End Sub
Sub Map_Ready
   Log("map ready")
   gmap = mFragment.GetMap
   If gmap.IsInitialized = False Then
      ToastMessageShow("Error initializing map.", True)
   Else
      gmap.AddMarker(36, 15, "Hello!!!")
      Dim cp As CameraPosition
      cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
      gmap.AnimateCamera(cp)
   End If
End Sub

You should see:

SS-2012-12-18_18.25.14.png


If you see a "white map" then there is most probably a mismatch between the: package name, sign key and the API key (from the manifest editor).

Google documentation: https://developers.google.com/maps/documentation/android/intro
Note that there is a required attribution which you must include in your app (see above link). You can get the string by calling MapFragment.GetOpenSourceSoftwareLicenseInfo.

V1.01: Fixes a bug in AddMarker2.
 

Attachments

  • GoogleMaps.zip
    17.8 KB · Views: 11,592
Last edited:

Trevor Parr

Member
Licensed User
Longtime User
Hi Folks,
wonder if someone can help me, I'm pretty new to the Android development, I'm trying to run the google maps example (as below) and I'm using my HTC Desire phone to test it on, which has google play installed etc.. and I've don all the API key stuff, but when I run it all I keep getting is the jave error nosuchmethod pointing to GetFragmentManager, any suggestions?


B4X:
Sub Process_Globals

End Sub

Sub Globals
   Dim mFragment As MapFragment
   Dim gmap As GoogleMap
   Dim MapPanel As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
   MapPanel.Initialize("")
   Activity.AddView(MapPanel, 0, 0, 100%x, 100%y)
   If mFragment.IsGooglePlayServicesAvailable = False Then
      ToastMessageShow("Google Play services not available.", True)
   Else
      mFragment.Initialize("Map", MapPanel)
   End If
End Sub
Sub Map_Ready
   Log("map ready")
   gmap = mFragment.GetMap
   If gmap.IsInitialized = False Then
      ToastMessageShow("Error initializing map.", True)
   Else
      gmap.AddMarker(36, 15, "Hello!!!")
      Dim cp As CameraPosition
      cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
      gmap.AnimateCamera(cp)
   End If
End Sub
 

Nostrildumbass

Member
Licensed User
Longtime User
Erel, in your example, the Map_Ready sub is never called.

By "never called" did you mean he never directly calls the Map_Ready Sub? That's because it is an event, not a Sub that you would just call. It is automatically "called" once your mFragment is initialized with your Map.

Remember that the name of the Sub "Map_Ready" needs to change if you changed the name of "Map" where you initialized your mFragment.

B4X:
mFragment.Initialize("MapNameHere", MapPanel)

Sub MapNameHere_Ready
End Sub
 

achtrade

Active Member
Licensed User
Longtime User
By "never called" did you mean he never directly calls the Map_Ready Sub? That's because it is an event, not a Sub that you would just call. It is automatically "called" once your mFragment is initialized with your Map.

Remember that the name of the Sub "Map_Ready" needs to change if you changed the name of "Map" where you initialized your mFragment.

B4X:
mFragment.Initialize("MapNameHere", MapPanel)

Sub MapNameHere_Ready
End Sub

thanks stealth, that was my concern
 

tango

Active Member
Licensed User
Longtime User
arsing code. 0.00
Compiling code. Error
Error compiling program.
Error description: Property: Points is readonly.
Occurred on line: 66
PolygonOptions1.Points=Points
Word: =

please tellme the problem?
 

warwound

Expert
Licensed User
Longtime User
arsing code. 0.00
Compiling code. Error
Error compiling program.
Error description: Property: Points is readonly.
Occurred on line: 66
PolygonOptions1.Points=Points
Word: =

please tellme the problem?

You are trying to write a property that is read only.

Maybe you want to try this syntax:

B4X:
PolygonOptions1.AddPoints(Points)
 

achtrade

Active Member
Licensed User
Longtime User
Please, I need an example :
1. draggable marker
2. Get the building number and street name from the dragged marker.

thanks.
 

achtrade

Active Member
Licensed User
Longtime User
B4X:
Dim m As Marker = gmap.AddMarker(...)
m.Draggable = true

You will need to use a geolocation service to find more information about the location.
Thanks. I'll try to find something about geolocation service for b4a
 

achtrade

Active Member
Licensed User
Longtime User
B4X:
Dim m As Marker = gmap.AddMarker(...)
m.Draggable = true

You will need to use a geolocation service to find more information about the location.

I'm using the example of the first post. How should be the change ?

B4X:
Sub Map_ReadyLog("map ready")
 gmap = mFragment.GetMapIf gmap.IsInitialized = FalseThenToastMessageShow("Error initializing map.", True)Else
 gmap.AddMarker(36, 15, "Hello!!!")Dim cp AsCameraPosition
 cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
 gmap.AnimateCamera(cp)EndIfEnd Sub
 

warwound

Expert
Licensed User
Longtime User
I'm using the example of the first post. How should be the change ?

B4X:
Sub Map_ReadyLog("map ready")
 gmap = mFragment.GetMapIf gmap.IsInitialized = FalseThenToastMessageShow("Error initializing map.", True)Else
 gmap.AddMarker(36, 15, "Hello!!!")Dim cp AsCameraPosition
 cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
 gmap.AnimateCamera(cp)EndIfEnd Sub

The AddMarker method returns a reference to the newly added Marker.
Your code current doesn't get and retain this reference, you need this reference in order to set the Marker's Draggable property.

Try this:

B4X:
Sub Map_ReadyLog("map ready")
	gmap = mFragment.GetMap
	If gmap.IsInitialized = False Then
		ToastMessageShow("Error initializing map.", True)
	Else
		Dim Marker1 As Marker = gmap.AddMarker(36, 15, "Hello!!!")
		Marker1.Draggable = True
		Dim cp AsCameraPosition
		cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
		gmap.AnimateCamera(cp)
	EndIf
End Sub
 

achtrade

Active Member
Licensed User
Longtime User
The AddMarker method returns a reference to the newly added Marker.
Your code current doesn't get and retain this reference, you need this reference in order to set the Marker's Draggable property.

Try this:

B4X:
Sub Map_ReadyLog("map ready")
    gmap = mFragment.GetMap
    If gmap.IsInitialized = False Then
        ToastMessageShow("Error initializing map.", True)
    Else
        Dim Marker1 As Marker = gmap.AddMarker(36, 15, "Hello!!!")
        Marker1.Draggable = True
        Dim cp AsCameraPosition
        cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
        gmap.AnimateCamera(cp)
    EndIf
End Sub

This didn't work. I can see the marker but when I try to drag it, the whole map move.
 
Status
Not open for further replies.
Top