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,581
Last edited:

warwound

Expert
Licensed User
Longtime User
Hi Erel
Can I determine the screen coordinates of Marker object?

GoogleMapsExtras allows you to use the Projection object.

You can get a LatLng from a screen coordinate and vice versa with it's FromScreenLocation and ToScreenLocation methods.

Unfortunately both these methods require a Point object and i think b4a has no native support for the Point object.

This is where i sometimes wonder if it'd be handy to have a database or even just a plain list of all Android classes that have currently been wrapped and can therefore be used in b4a - it'd save me wrapping a class that has already been wrapped in another library.

Anyway, i'll update GoogleMapsExtras a bit later so that you can use it's FromScreenLocation and ToScreenLocation methods.

Martin.
 

warwound

Expert
Licensed User
Longtime User
:sign0161:

What am i saying - i've already added a Point wrapper to the GoogleMapsExtras library!

Must be time for a rest.

So you can in fact create a LatLng and then use the Projection method ToScreenLocation to get a Point which represents the current screen position of that LatLng.

Martin.
 

denik

Member
Licensed User
Longtime User
Hi, Martin
When I add GoogleMapsExtras library (even in empty project) and insert the only string
Dim p As Point
it is
java.lang.RuntimeException: Object should first be initialized (Point).
 

warwound

Expert
Licensed User
Longtime User
I've now fixed the bug where Point could not be initialized, get the updated version of GoogleMapsExtras from here: http://www.b4x.com/forum/additional...pdates/26277-googlemapsextras.html#post152004.

And here's an example that logs the screen coordinates each time the map position changes:

B4X:
Sub Process_Globals

End Sub

Sub Globals
    Dim GoogleMap1 As GoogleMap
   Dim GoogleMapsExtras1 As GoogleMapsExtras
    Dim MapFragment1 As MapFragment
    Dim MapPanel As Panel
   Dim Projection1 As Projection
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Main")
    If MapFragment1.IsGooglePlayServicesAvailable = False Then
        ToastMessageShow("Google Play services not available.", True)
    Else
        MapFragment1.Initialize("MapFragment1", MapPanel)
    End If 
End Sub

Sub MapFragment1_Ready
    Log("MapFragment1_Ready")
    GoogleMap1 = MapFragment1.GetMap
    If GoogleMap1.IsInitialized = False Then
        ToastMessageShow("Error initializing map.", True)
    Else
        Dim CameraPosition1 As CameraPosition
        CameraPosition1.Initialize(52, 0.75, 6)
        GoogleMap1.AnimateCamera(CameraPosition1)
    End If
End Sub

Sub MapFragment1_CameraChange (Position As CameraPosition)
   Projection1=GoogleMapsExtras1.GetProjection(GoogleMap1)
   
   Dim Point1 As Point
   Point1=Projection1.ToScreenLocation(Position.Target)
   
   Log("LatLng1: "&Position.Target)
   Log("Point1: "&Point1)
   
End Sub

On my Novo ElfII tablet that always logs (512, 246), the documentation states:

Returns a screen location that corresponds to a geographical coordinate (LatLng). The screen location is in screen pixels (not display pixels) relative to the top left of the map (not of the whole screen).

So i'm not sure how to use these coordinates, i'll have to leave you to experiment.

Martin.
 

Attachments

  • GoogleMapsExtras - Projection.zip
    7.5 KB · Views: 743

Bart Kerver

New Member
Licensed User
Longtime User
Android 2 and google maps

HI,

I'm aware of "this library requires Android 3+" and it works fine on my tablet, but was wondering how the Google Maps (the app) on a Android 2 (gingerbread - Samsung galaxy2) seems to be working fine.

Is this a B4A library issue or does Google Maps (the app) work a different way on Android 2x?

Kind regards,
Bart
 

desof

Well-Known Member
Licensed User
Longtime User
followed to the letter and I get this error I am doing wrong?

followed to the letter and I get this error I am doing wrong?


Parsing code. 0.00
Compiling code. 0.20
Compiling layouts code. 0.02
Generating R file. 0.45
Compiling generated Java code. Error
B4A line: 44
gmap.AnimateCamera(cp)
javac 1.7.0_17
src\b4a\example\main.java:338: error: package com.google.android.gms.maps.model does not exist
mostCurrent._gmap.AnimateCamera((com.google.android.gms.maps.model.CameraPosition)(_cp.getObject()));
^
1 error
 

tpakis

Active Member
Licensed User
Longtime User
This library wraps MapFragment which is only supported by Android 3+. There is another API named SupportMapFragment that is based on a "support library" for backwards compatibility (as Fragments were not supported in Android 2).

There are some known issues with SupportMapFragment.

Erel is it very difficult to make a second library that wraps SupportMapFragment? I have seen google maps v2 running on 2.2 devices. Nearly 60% of my app users according to store still use 2.2-2.3
 

AlteregoHR

Member
Licensed User
Longtime User
Hello to all,
This is my first post :)
I just bought B4a and I am trying Google maps api. I went through all the steps successfully except adding lines to manifest editor.
I copied the lines that go to the manifest and added key from google.
Now, when compiling I get:
Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED] :sign0085:

Edit: The answer was in another Thread : Package name with non-lowercase letter
 
Last edited:

tpakis

Active Member
Licensed User
Longtime User
If you like I can upload the code and you can try to modify it as needed (I actually think that the code should be already available in this thread somewhere).

You mean the java code for the library? Yes why not (didn't find it in the thread).
 

warwound

Expert
Licensed User
Longtime User
How i can get the event when i clic on the InfoWindow (not directly the marker) ?

I have updated GoogleMapsExtras adding support for the OnInfoWindowClickListener.

Here's some example code:

B4X:
Sub Process_Globals

End Sub

Sub Globals
    Dim GoogleMap1 As GoogleMap
   Dim Label1 As Label
    Dim MapFragment1 As MapFragment
    Dim MapPanel As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Main")
    If MapFragment1.IsGooglePlayServicesAvailable = False Then
        ToastMessageShow("Google Play services not available.", True)
    Else
        MapFragment1.Initialize("MapFragment1", MapPanel)
    End If 
End Sub

Sub MapFragment1_Ready
    Log("MapFragment1_Ready")
    GoogleMap1 = MapFragment1.GetMap
    If GoogleMap1.IsInitialized = False Then
        ToastMessageShow("Error initializing map.", True)
    Else
      GoogleMap1.MapType=GoogleMap1.MAP_TYPE_NORMAL
      
      Dim Coords() As Double=Array As Double(52.7667, 0.3931, 52.7480, 0.3918, 52.7550, 0.4026, 52.7667, 0.3931)
      Dim i As Int
      For i=0 To Coords.Length-2 Step 2
         Dim Marker1 As Marker
         Marker1=GoogleMap1.AddMarker(Coords(i), Coords(i+1), "Marker #"&(i/2))
         Marker1.Draggable=True
      Next
      
      Dim GoogleMapsExtras1 As GoogleMapsExtras
      
      Dim OnInfoWindowClickListener1 As OnInfoWindowClickListener
      OnInfoWindowClickListener1.Initialize("OnInfoWindowClickListener1")
      
      If OnInfoWindowClickListener1.IsInitialized Then
         GoogleMapsExtras1.SetOnInfoWindowClickListener(GoogleMap1, OnInfoWindowClickListener1)
      Else
         Log("OnInfoWindowClickListener1 is not initialized - check that the Activity contains a Click callback Sub")
      End If
      
        Dim CameraPosition1 As CameraPosition
        CameraPosition1.Initialize(52.75811, 0.3912, 13)
        GoogleMap1.AnimateCamera(CameraPosition1)
    End If
End Sub

Sub OnInfoWindowClickListener1_Click(Marker1 As Marker)
   Log("OnInfoWindowClickListener1_Click")
   Label1.Text=Marker1.Title&" : "&Marker1.Position
End Sub

3 Markers are added to the map, a click on a Marker shows an infowindow and a click on an infowindow causes the OnInfoWindowClickListener1_Click Sub to be called and a Label displays the position and title of the Marker that the infowindow was opened on.

Martin.
 

Attachments

  • OnInfoWindowClickListener.zip
    7.8 KB · Views: 773

AlteregoHR

Member
Licensed User
Longtime User
Hello to all,
Is there any chance that someone can make example of:
1. Adding markers to the map with button click after the map was initialised and frst set of marks were added during first setup. ( I want to add few marks form file or database on button click event, but keep the old ones. )
2. Keeping map in the same location after the screen rotation?

I am new to this and tryinig to figure how to do that but I just cant do it :BangHead:

Thanks for helping :sign0104:
 
Status
Not open for further replies.
Top