Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google maps api not placing marker at fine location

My code is supposed to find out the users location and place a marker on the map upon entering the application. My location value always equals null, and never receives 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();

            }

        }
like image 738
The Tokenizer Avatar asked Apr 22 '12 07:04

The Tokenizer


1 Answers

I've had a relatively similar issue with a GPS RPG I was working on and here are some things I noticed:

Firstly, it can take a while for your location to initially be found, which would cause that issue since you're only checking if the location is null.

You may also want to make sure the device's location services are actually enabled 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've made sure the providers are available I setup a connection like so:

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

The location is then set in a global variable whenever it's updated, and then saved to the preferences. This way, in the event that the providers are enabled, but are taking a while to retrieve the location, the user can still continue to use the application with their last known location that the app stored (does not apply to the first time the program is run).

I know I left out a lot there, but I figured it wasn't really necessary since it was either self-explanatory or already explained in a previous answer.

Cheers~

like image 59
Cruceo Avatar answered Sep 30 '22 19:09

Cruceo