Google Maps Android api v2 et emplacement actuel

J'essaie d'utiliser les nouveaux google maps android api v2 et je développe une application pour Android 2.3.3 ou supérieure. C'est une application très simple: il prend l'emplacement actuel de l'utilisateur (en utilisant le signal des gps ou des réseaux), il obtient à partir de db un POI en utilisant la direction api, il conduit l'utilisateur vers le POI.

Mon problème est d'obtenir l'emplacement actuel de l'utilisateur. Merci à cette publication Comment obtenir l'emplacement actuel dans Google Maps Android API v2? J'ai appris que je ne peux pas mettre à jour la position actuelle en utilisant de nouveaux google api. Un autre problème est que je peux définir ma position en utilisant GoogleMap setMyLocationEnabled(boolean enabled) mais je ne peux pas utiliser getMyLocation() pour savoir où est l'utilisateur.

J'ai utilisé ce guide http://www.vogella.com/articles/AndroidLocationAPI/article.html#maps_mylocation pour obtenir mon emplacement, et j'ai essayé d'intégrer dans mon activité pour dessiner la position de l'utilisateur.

Ici mon code:

Manifeste

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.mappe" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="it.mappe.permission.MAPS_RECEIVE" /> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MYGMAPSKEY" /> <activity android:name="it.mappe.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

activité principale

 package it.mappe; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.FragmentActivity; import android.widget.Toast; public class MainActivity extends FragmentActivity implements LocationListener { private GoogleMap map; private static final LatLng ROMA = new LatLng(42.093230818037,11.7971813678741); private LocationManager locationManager; private String provider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabledGPS = service .isProviderEnabled(LocationManager.GPS_PROVIDER); boolean enabledWiFi = service .isProviderEnabled(LocationManager.NETWORK_PROVIDER); // Check if enabled and if not send user to the GSP settings // Better solution would be to display a dialog and suggesting to // go to the settings if (!enabledGPS) { Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define the criteria how to select the locatioin provider -> use // default Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); // Initialize the location fields if (location != null) { Toast.makeText(this, "Selected Provider " + provider, Toast.LENGTH_SHORT).show(); onLocationChanged(location); } else { //do something } } /* Request updates at startup */ @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(provider, 400, 1, this); } /* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { double lat = location.getLatitude(); double lng = location.getLongitude(); Toast.makeText(this, "Location " + lat+","+lng, Toast.LENGTH_LONG).show(); LatLng coordinate = new LatLng(lat, lng); Toast.makeText(this, "Location " + coordinate.latitude+","+coordinate.longitude, Toast.LENGTH_LONG).show(); Marker startPerc = map.addMarker(new MarkerOptions() .position(coordinate) .title("Start") .snippet("Inizio del percorso") .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))); } @Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onProviderEnabled(String provider) { Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } 

Disposition principale

 <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> 

Il fonctionne mais pas si bon, comme vous pouvez le voir dans les images, il y a un nouvel emplacement, il ajoute un nouveau marqueur (ex Overlay, je pense … Je n'utilise jamais les anciens google maps api). Entrez la description de l'image ici

Comment afficher un seul marqueur?

En plus de ma carte, j'ai besoin d'afficher aussi le marqueur de POI, alors je pense que ce n'est pas une bonne solution, de préciser tout le marqueur et de le redessiner sur les cartes. Il existe un autre meilleur moyen d'obtenir l'emplacement actuel de l'utilisateur, en le mettant à jour chaque instant affichant un seul marqueur personnalisé?

  • Google Maps v2 - définit mon emplacement et mon zoom
  • Les ressources des services Google Play n'ont pas été trouvées. Vérifiez la configuration de votre projet pour vous assurer que les ressources sont incluses
  • Dessinez un chemin sur les cartes en suivant le chemin du mouvement du doigt sur l'écran du périphérique
  • Impossible de trouver la classe 'com.google.android.gms.location.internal.ParcelableGeofence référencée à partir de la méthode glt.a
  • Dessine les frontières du pays sous forme de polygones
  • Modifiez ou supprimez complètement la couleur de surbrillance d'un InfoWindow de Google Maps v2 sur Android
  • Google Maps API v2 ne fonctionne pas
  • Google Map Android API v2 ne peut pas afficher la carte dans l'application play store
  • 7 Solutions collect form web for “Google Maps Android api v2 et emplacement actuel”

    Vous pouvez appeler startPerc.remove(); Pour supprimer uniquement ce marqueur.

    D' ici

    Pourquoi ne pas utiliser startPerc.setPosition pour déplacer le marqueur au lieu de continuer à ajouter et supprimer …

    Définissez la position du marqueur lorsque vous obtenez un autre emplacement par cette méthode

     marker. set position (location) 

    Vous devez utiliser googlemap.clear () avant d'ajouter le marqueur car chaque fois que l'emplacement change, il ajoute un nouveau marqueur sur la carte avec le marqueur le plus ancien. Alors utilisez googlemap.clear () avant d'ajouter le marqueur dans l'emplacement modifié. Il supprimera le marqueur le plus ancien et ajoutera un nouveau marqueur. Googlemap est l'instance de la classe GoogleMap .

    Vous pouvez remplacer le marqueur par un nouveau:

     if(userMarker!=null) userMarker.remove(); userMarker = theMap.addMarker(new MarkerOptions() .position(lastLatLng) .title("You are here") .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_loc_icon)) .snippet("Your current location")); 

    Raccourci complet pour définir Google Map android v2 dans Android …

    Fichier XML:

     <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

    Menifest file:

     <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Map permission Starts --> <permission android:name="com.example.mapdemoapiv2.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.mapdemoapiv2.permission.MAPS_RECEIVE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <!-- Map permission Starts --> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.mapdemoapiv2.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MapDetail" > </activity> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="Your Key" /> <uses-library android:name="com.google.android.maps" /> </application> 

    Classe d'activité:

     public class MainActivity extends android.support.v4.app.FragmentActivity { GoogleMap googleMap; MarkerOptions markerOptions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setUpMapIfNeeded(); GetCurrentLocation(); } private void setUpMapIfNeeded() { if (googleMap == null) { Log.e("", "Into null map"); googleMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter( MainActivity.this)); if (googleMap != null) { Log.e("", "Into full map"); googleMap.setMapType(googleMap.MAP_TYPE_NORMAL); googleMap.getUiSettings().setZoomControlsEnabled(false); } } } private void GetCurrentLocation() { double[] d = getlocation(); Share.lat = d[0]; Share.lng = d[1]; googleMap .addMarker(new MarkerOptions() .position(new LatLng(Share.lat, Share.lng)) .title("Current Location") .icon(BitmapDescriptorFactory .fromResource(R.drawable.dot_blue))); googleMap .animateCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(Share.lat, Share.lng), 5)); } public double[] getlocation() { LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); List<String> providers = lm.getProviders(true); Location l = null; for (int i = 0; i < providers.size(); i++) { l = lm.getLastKnownLocation(providers.get(i)); if (l != null) break; } double[] gps = new double[2]; if (l != null) { gps[0] = l.getLatitude(); gps[1] = l.getLongitude(); } return gps; } 

    Tout d'abord dans la carte api v2, utilisez l'emplacementClient pour récupérer votre emplacement, voir: http://developer.android.com/training/location/retrieve-current.html

    Iportant: pour lancer l'API de début, appelez-le en début d'activité principale:

     private void kickStardedLocationManager(){ // Acquire a reference to the system Location Manager LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates android.location.LocationListener locationListener = new android.location.LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. //MainActivity.this.makeUseOfNewLocation(location); } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; long l = 10; float f = 100; // Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); //LocationManager.GPS_PROVIDER } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.