je crée une application avec une vue Google Map et je veux que cette application détecte la position actuelle de l'utilisateur et affiche le lat et long avec un marqueur sur la carte, mais tout ce que je peux faire jusqu'à maintenant est l'affichage de la carte Google et la détection de la position actuelle sans aucun marqueur affiché et sans aucun texte apparaît pour afficher le dernier et long
je n'ai pas ajouté de marqueur jusqu'à maintenant parce que je ne sais pas où le mettre dans le code et quelle est la meilleure pratique pour le faire.
quelqu'un peut-il m'aider ??? c'est le code de la:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="in.wptrafficanalyzer.locationgooglemapv2demo"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk
Android:minSdkVersion="8"
Android:targetSdkVersion="16" />
<permission
Android:name="in.wptrafficanalyzer.LocationGoogleMapV2Demo.permission.MAPS_RECEIVE"
Android:protectionLevel="signature" />
<uses-permission Android:name="in.wptrafficanalyzer.LocationGoogleMapV2Demo.permission.MAPS_RECEIVE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<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-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" >
<activity
Android:name="in.wptrafficanalyzer.locationgooglemapv2demo.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>
<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="API KEY" />
</application>
</manifest>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
Android:id="@+id/tv_location"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<fragment
Android:id="@+id/map"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
class="com.google.Android.gms.maps.SupportMapFragment" />
</RelativeLayout>
package in.wptrafficanalyzer.locationgooglemapv2demo;
import Android.app.Dialog;
import Android.location.Criteria;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import Android.view.Menu;
import Android.widget.TextView;
import com.google.Android.gms.common.ConnectionResult;
import com.google.Android.gms.common.GooglePlayServicesUtil;
import com.google.Android.gms.maps.CameraUpdateFactory;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.SupportMapFragment;
import com.google.Android.gms.maps.model.LatLng;
public class MainActivity extends FragmentActivity implements LocationListener {
GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
// Showing status
if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available
int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
dialog.show();
}else { // Google Play Services are available
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
googleMap = fm.getMap();
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
if(location!=null){
onLocationChanged(location);
}
locationManager.requestLocationUpdates(provider, 20000, 0, this);
}
}
@Override
public void onLocationChanged(Location location) {
TextView tvLocation = (TextView) findViewById(R.id.tv_location);
// Getting latitude of the current location
double latitude = location.getLatitude();
// Getting longitude of the current location
double longitude = location.getLongitude();
// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Showing the current location in Google Map
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
// Setting latitude and longitude in the TextView tv_location
tvLocation.setText("Latitude:" + latitude + ", Longitude:"+ longitude );
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Tout d’abord, vérifiez la documentation ici , elle donne une bonne indication des meilleures stratégies pour obtenir la position de l’utilisateur.
Personnellement, je commence habituellement la carte avec un marqueur placé à la position retrivied avec
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
et puis je commence à écouter pour la mise à jour de la position et déplace le marqueur.
Cela dépend également de la précision de la position dont vous avez besoin pour l'application de votre application. Si vous n'avez pas besoin d'une position vraiment précise mais que la zone est suffisante, vous pouvez simplement utiliser la variable lastKnownLocation
.
Vous pouvez essayer quelque chose comme ça
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
// Showing status
if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available
int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
dialog.show();
}else { // Google Play Services are available
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
googleMap = fm.getMap();
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
LocationListener locationListener = new LocationListener() {
void onLocationChanged(Location location) {
// redraw the marker when get location update.
drawMarker(location);
}
if(location!=null){
//PLACE THE INITIAL MARKER
drawMarker(location);
}
locationManager.requestLocationUpdates(provider, 20000, 0, locationListener);
}
}
private void drawMarker(Location location){
// Remove any existing markers on the map
googleMap.clear();
LatLng currentPosition = new LatLng(location.getLatitude(),location.getLongitude());
googleMap.addMarker(new MarkerOptions()
.position(currentPosition)
.snippet("Lat:" + location.getLatitude() + "Lng:"+ location.getLongitude())
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure))
.title("ME"));
}
De plus, vous n'avez pas besoin de la classe d'activité pour implements LocationListener
, vous pouvez simplement définir un auditeur et l'enregistrer comme je l'ai fait ci-dessus
P.S. Je n'ai pas de fils d'édition, mon code peut contenir une faute de frappe
J'espère que ça aide, à la vôtre
Je viens d'avoir le même problème et j'ai trouvé un moyen de le faire en utilisant l'API Google Maps:
private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
mMarker = mMap.addMarker(new MarkerOptions().position(loc));
if(mMap != null){
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
}
}
};
puis définissez l'auditeur pour la carte:
mMap.setOnMyLocationChangeListener(myLocationChangeListener);
Cela sera appelé lorsque la carte trouvera l’emplacement pour la première fois.
Pas besoin de LocationService
ou LocationManager
du tout.
Il vaut mieux utiliser:
Location currentLocation =
LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
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" />
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;
}
facile comme ça:
après ça -
<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="Your Key" />
mettre ceci -
<meta-data Android:name="com.google.Android.gms.version" Android:value="4030500" />