Search code examples
androidgoogle-maps-android-api-2android-gps

Identify user location in android


I'm quite a beginner to android and I'm trying out my best to learn android. I'm trying to create an android application that identify the user location using google maps. However I was able to identify user's location, but not as I expected.

As in the following picture it shows a default location. Once I click the button in top left corner, the map shows my location.

enter image description here

I would like to know my location straight away, without clicking a button. Also I want to know the user location and store it in a string, not in longitude and latitude values. Any Help?

Code:

package com.example.lalinda.googlemap1;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMyLocationEnabled(true);
    }
}

Solution

  • Google maps uses user's lastKnownLocation for location, If the lastknownLocation is unknown it takes time to fetch location through different provider say GPS or Network. I would suggest to use lastKnownLocation as base location and update it with LocationListener.

           @Override
           public void onMapReady(GoogleMap googleMap) { 
           if (ActivityCompat.checkSelfPermission
                    (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    &&
                    ActivityCompat.checkSelfPermission
                            (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                requestPermissions(new String[]{
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
                }, 1);
    
            }
            else {
    
                // enable location buttons
                googleMap.setMyLocationEnabled(true);
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);
    
                // fetch last location if any from provider - GPS.
                final LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                final Location loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                //if last known location is not available
                if (loc == null) {
    
                    final LocationListener locationListener = new LocationListener() {
                        @Override
                        public void onLocationChanged(final Location location) {
                            clearMap(googleMap); // clear map for every new location to update your marker unless `n` number of markers will form.
                            // getting location of user
                            final double latitude = location.getLatitude();
                            final double longitude = location.getLongitude();
                            final LatLng userCurrentLocation = new LatLng(latitude, longitude);
                            //focus added here **edited**
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));
    
                            googleMap.addMarker(new MarkerOptions()
                           .position(userCurrentLocation)
                           .draggable(true)
           .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
                            //do something with Lat and Lng, Parse to String if u want or set marker.
    
                        }
    
                        @Override
                        public void onStatusChanged(String provider, int status, Bundle extras) {
                        }
    
                        @Override
                        public void onProviderEnabled(String provider) {
                            //when user enables the GPS setting, this method is triggered.
                        }
    
                        @Override
                        public void onProviderDisabled(String provider) {
                            //when no provider is available in this case GPS provider, trigger your gpsDialog here.
                        }
                    };
    
                    //update location every 10sec in 500m radius with both provider GPS and Network.
    
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10*1000, 500, locationListener);
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 500, locationListener);
                }
                else {
                    //do something with last known location.
                    // getting location of user
                    final double latitude = loc.getLatitude();
                    final double longitude = loc.getLongitude();
                    final LatLng userCurrentLocation = new LatLng(latitude, longitude);
    
                    //focus added here **edited**
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));
    
                    googleMap.addMarker(new MarkerOptions()
                    .position(userCurrentLocation)
                    .draggable(true)
           .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
                }
               }
            }
    

    Permission handling:

         @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
    
            case 1:
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
                    //do something
                }
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    

    This example is just for demonstration (example purpose) and I did not optimized my code by using methods. please edit in future.