Google maps api doesn't place marker at exact location

My code should determine the location of the user and place the marker on the map when entering the application. My location value is always zero and never gets a value.

if (location != null) { lat = (int) (location.getLatitude() * 1E6); longi = (int) (location.getLongitude() * 1E6); GeoPoint ourLocation = new GeoPoint(lat, longi); OverlayItem overlayItem = new OverlayItem(ourLocation, "AYO", "Whats good yo"); CustomPinpoint custom = new CustomPinpoint(d, CampusMap.this); custom.insertPinpoint(overlayItem); overlayList.add(custom); } else { Toast.makeText(CampusMap.this, "Couldn't get provider", Toast.LENGTH_SHORT).show(); } } 
+6
source share
3 answers

I had a relatively similar issue with the GPS RPG that I was working on, and here are some of the comments I noticed:

First, it may take some time for your location, which can cause a problem as you check to see if this field is null.

You can also make sure that location services are actually turned on before doing anything:

 private boolean doLocationsCheck(){ if(!checkLocationEnabled()){ final CharSequence[] items = {"Yes", "No"}; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setCancelable(false); builder.setTitle("Location must be enabled to play this game! Would you like to enable it now?"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { final int i = item; runOnUiThread(new Runnable() { public void run() { if(i == 0){ Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); quit(); } else{ quit(); } } }); } }).show(); AlertDialog alert = builder.create(); return false; } else { return true; } } private boolean checkLocationEnabled(){ LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER) || service.isProviderEnabled(LocationManager.NETWORK_PROVIDER); return enabled; } 

After I make sure the providers are available, I configure the connection like this:

  private void setupLocation() { LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { public void onLocationChanged(final Location location) { runOnUiThread(new Runnable() { public void run() { mLocation = location; //Log.d(TAG, "Latitude: " + location.getLatitude() + " - Longitude: " + location.getLongitude()); saveLocation(); } }); } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; //Can set to GPS or network, whichever is available locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 

Then the location is set in the global variable whenever it is updated, and then saved in the settings. Thus, if the providers are turned on, but take some time to get the location, the user can still continue to use the application with his last known location where the application is stored (the program does not start for the first time).

I know that I didn’t have much there, but I thought it really wasn’t necessary, because in the previous answer it was either explained or explained.

Greetings ~

+1
source
  /* * getting the best location using the location manager * Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1000 Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1 */ LocationManager mLocation; private String mBestProvider; // in your onCreate() do the following mLocation = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); mBestProvider = mLocation.getBestProvider(criteria, false); Location location = mLocation.getLastKnownLocation(mBestProvider); mLocation.requestLocationUpdates( LocationManager.GPS_PROVIDER, Constants.MINIMUM_TIME_BETWEEN_UPDATES, Constants.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListenerManager() ); // and use the following locationListener inner class private class LocationListenerManager implements LocationListener { public void onLocationChanged(Location location) { String message = String.format( "New Location \n Longitude: %1$s \n Latitude: %2$s", location.getLongitude(), location.getLatitude() ); latitude = location.getLatitude(); longitude = location.getLongitude(); Toast.makeText(MapViewActivity.this, message, Toast.LENGTH_LONG).show(); Log.v("poiint=====", ""+message); } public void onStatusChanged(String s, int i, Bundle b) { Toast.makeText(MapViewActivity.this, "Provider status changed", Toast.LENGTH_LONG).show(); } public void onProviderDisabled(String s) { Toast.makeText(MapViewActivity.this, "Provider disabled by the user. GPS turned off", Toast.LENGTH_LONG).show(); } public void onProviderEnabled(String s) { Toast.makeText(MapViewActivity.this, "Provider enabled by the user. GPS turned on", Toast.LENGTH_LONG).show(); } } 
0
source

You must initialize the locationlister in onstartActivity before creating it so that its location determines the location value before onCreate.

0
source

Source: https://habr.com/ru/post/913828/


All Articles