java android google-maps google-maps-api-2

java - Google Maps Android api v2 y ubicación actual



google-maps google-maps-api-2 (7)

Estoy tratando de usar el nuevo google maps android api v2 y estoy desarrollando una aplicación para Android 2.3.3 o superior. Es una aplicación muy simple: toma la ubicación actual del usuario (usando gps o señal de red) que recibe de un PDI usando la api de dirección, lleva al usuario al POI.

Mi problema es obtener la ubicación actual del usuario. gracias a esta publicación ¿Cómo obtener la ubicación actual en Google Maps Android API v2? Aprendí que no puedo actualizar la posición actual usando la nueva API de Google. Otro problema es que puedo establecer mi posición usando GoogleMap setMyLocationEnabled(boolean enabled) pero no puedo usar getMyLocation() para saber dónde está el usuario.

Utilicé esta guía http://www.vogella.com/articles/AndroidLocationAPI/article.html#maps_mylocation para obtener mi ubicación, y traté de integrarme dentro de mi actividad para dibujar la posición del usuario.

aqui mi codigo:

Manifiesto

<?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>

actividad principal

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 } }

diseño principal

<?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" />

Funciona, pero no tan bien, como se puede ver en las imágenes, cada vez que hay una nueva ubicación, se agrega un nuevo Marcador (creo que en Overlay ... Nunca uso la antigua API de Google Maps).

¿Cómo puedo mostrar sólo un marcador?

Además, en mi mapa necesito mostrar también el marcador de POI, por lo que creo que no es una buena solución borrar todos los marcadores y volver a dibujarlos en los mapas. ¿Hay otra mejor manera de obtener la ubicación actual del usuario, actualizándola en cada momento y mostrando solo un marcador personalizado?


¿Por qué no usar startPerc.setPosition para mover el marcador en lugar de seguir agregando y eliminando ...


Acceso directo completo para definir el Google Map android v2 en Android ......

Archivo XML:

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

Archivo de manifiesto:

<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>

Clase de actividad:

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; }


Debería usar googlemap.clear () antes de agregar el marcador porque cada vez que la ubicación cambia, agrega un nuevo marcador en el mapa con el marcador más antiguo. así que use googlemap.clear () antes de agregar el marcador en la ubicación cambiada. eliminará el marcador más antiguo y agregará un nuevo marcador. googlemap es la instancia de GoogleMap Class.


En primer lugar, en el mapa api v2 use LocationClient para recuperar su ubicación, consulte: http://developer.android.com/training/location/retrieve-current.html

Importante: para activar la API de inicio, llame a esto en onStart de la actividad principal:

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 }


Podrías reemplazar el marcador por uno nuevo:

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"));


Puede llamar a startPerc.remove(); para borrar solo este marcador.

Desde here


establece la posición del marcador cuando obtienes otra ubicación con este método

marker. set position (location)