Pour avoir Google Map dans son application, 4 étapes sont nécessaires :
- Obtenir une clé pour utiliser l’API
- Récupérer le Google Map service
- Ajouter les informations nécessaires dans Google MAP
- Implémenter le fragment dans l’application
Obtenir une clé pour utiliser l’API
Tout d’abord, il faut se connecter sur le site de Google API Console . Puis dans le menu gauche, il faut cliquer sur API Access et cliquer sur « Create New Android Key… ».
Nous avons besoin de récupérer l’empreinte de notre clé grâce au SHA1, pour cela il faut se placer dans le répertoire cd ~/.android/. C’est ici que se trouve votre clé debug.keystore.
keytool -list -v -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android |
Grâce a cette commande, on peut récupérer une empreinte du certificat. En l’occurrence, la ligne qui nous intéresse est celle avec clé SHA1.
Copier cette ligne sur le site de google API et ajouter à la fin un ; + le nom du package.
Cela va générer une API clé qu’il faudra utiliser dans votre manifest.
Note: : Pour définir le nom du package, il faut regarder dans votre manifest le package définit. En ce qui me concerne, j’ai choisi : fr.oversimple.applicationdemo
Récupérer le Google Map service
Afin d’utiliser Google Map, il faut télécharger la librairie : Google Play services via le Android SDK Manager
Une fois le téléchargement effectué il faut l’ajouter comme librairie dans l’environnement de développement. Le répertoire se trouve dans extra/google/google_play_services . Pour Eclipse, il faut le déclarer comme une librairie (Clic droit sur le projet -> Properties -> Android -> Is Library) Puis pour le projet, au lieu de le déclarer comme librairie, il faut l’ajouter comme librairie.
En ce qui concerne Android studio (ou Intellij), il faut l’importer comme module.
Ajouter les informations nécessaires dans Google MAP
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.oversimple.applicationdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <permission android:name="fr.oversimple.applicationdemo.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <!-- Google map --> <uses-permission android:name="fr.oversimple.applicationdemo.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.OrangeNoActionBar" > <activity android:name=".activities.MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- https://code.google.com/apis/console/ --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="Votre API KEY" /> </application> </manifest> |
Implémenter le fragment dans l’application
Le XML correspondant map_main_activity.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.google.android.gms.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </RelativeLayout> |
Le code correspondant pour la map :
public class MapsFragment extends Fragment { private MapView map; public MapsFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.map_main_activity, container, false); if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity().getApplicationContext()) == ConnectionResult.SUCCESS) { //Initialze mapview MapsInitializer.initialize(getActivity()); map = (MapView) view.findViewById(R.id.mapView); map.onCreate(savedInstanceState); GoogleMap gMap = map.getMap(); gMap.addMarker(new MarkerOptions().title("title").snippet("description").position(new LatLng(49.5594950, -1.8414880))).showInfoWindow(); } else { Toast.makeText(getActivity(), "Please install google play services", Toast.LENGTH_LONG).show(); } return view; } @Override public void onResume() { super.onResume(); map.onResume(); } @Override public void onPause() { super.onPause(); map.onPause(); } @Override public void onDestroy() { super.onDestroy(); map.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); map.onLowMemory(); } } |
Pour appeler le fragment, l’id content frame correspond à mon cœur d’application. En l’occurrence, je l’ai utilisé avec le navigation drawer d’Android afin d’avoir un menu sur la gauche.
mapFragment = new MapsFragment(); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, mapFragment).commit(); |
Ce fragment de Google Map peut être remplacé facilement par un autre fragment.
It’s oversimple, isn’t it?