J'essaie d'utiliser les nouvelles cartes google Android api v2 et je développe une application pour Android 2.3.3 ou supérieur. C'est très simple) application: elle prend la position actuelle de l'utilisateur (en utilisant le signal GPS ou réseau) qu'elle obtient de la base de données d'un POI en utilisant la direction api, elle conduit l'utilisateur au POI.
Mon problème est d'obtenir l'emplacement actuel de l'utilisateur. grâce à ce post 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 la nouvelle API Google. Un autre problème c'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é de m'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" />
Cela fonctionne mais pas si bien, comme vous pouvez le voir sur les photos chaque fois qu'il y a un nouvel emplacement, il ajoute un nouveau marqueur (ex Overlay, je pense ... Je n'utilise jamais d'anciennes API Google Maps).
Comment afficher un seul marqueur?
De plus, sur ma carte, j'ai besoin d'afficher également le marqueur de POI, donc je pense que ce n'est pas une bonne solution de supprimer tous les marqueurs et de les redessiner sur les cartes. Il existe un autre meilleur moyen d'obtenir l'emplacement actuel de l'utilisateur, en le mettant à jour à chaque instant en affichant un seul marqueur personnalisé?!
Vous pouvez appeler startPerc.remove();
pour supprimer uniquement ce marqueur.
De ici
Pourquoi ne pas simplement utiliser startPerc.setPosition
pour déplacer le marqueur au lieu de continuer à ajouter et supprimer ...
définir 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, ajoutez un nouveau marqueur sur la carte avec le marqueur le plus ancien. utilisez donc 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 GoogleMap Class.
Raccourci complet pour définir la carte Google 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" />
Fichier de manifeste:
<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 LocationClient pour récupérer votre position, voir: http://developer.Android.com/training/location/retrieve-current.html
Iportant: pour lancer l'API, appelez-le dans le démarrage de l'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
}
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"));