web-dev-qa-db-fra.com

Google Maps Android api v2 et position actuelle

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). enter image description here

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

18
antedesk

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

De ici

7
Adrián Rodríguez

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

4
Arch1tect

définir la position du marqueur lorsque vous obtenez un autre emplacement par cette méthode

marker. set position (location)
2
user2866813

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.

1
Shivam saxena

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;
}
0
Mitul Goti

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

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"));
0
Paul Ledger