1

I'm using google map in a project, where I want to get my current location which is not working correctly,

MyActivity.java code:

 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (enabled) {
            Criteria criteria = new Criteria();
            String bestProvider = locationManager.getBestProvider(criteria, true);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            Location location = locationManager.getLastKnownLocation(bestProvider);
            if (location != null) {
                lat = location.getLatitude();
                lng = location.getLongitude();
                return;
            }
        }

but it returns null every time, first i want know what's the problem and what's the best way to get my current location?

AndroidManifest.xml code

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
  <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />
Elye
  • 53,639
  • 54
  • 212
  • 474
SadeQ digitALLife
  • 1,403
  • 4
  • 16
  • 22

4 Answers4

2

Use this Google Map API v2 Method

private void getCurrentLocation() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            mMap.setMyLocationEnabled(true);
            // Check if we were successful in obtaining the map.
            if (mMap != null) {


             mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {

           @Override
           public void onMyLocationChange(Location arg0) {
            // TODO Auto-generated method stub

             mMap.addMarker(new MarkerOptions().position(new LatLng(arg0.getLatitude(), arg0.getLongitude())).title("It's Me!"));
           }
          });

            }
        }
    }
Praveen Kumar
  • 277
  • 2
  • 12
1

Well, this is how I did it in my app:

First declare:

private Location mylocation;
private GoogleApiClient googleApiClient;
private final static int REQUEST_CHECK_SETTINGS_GPS = 0x1;
private final static int REQUEST_ID_MULTIPLE_PERMISSIONS = 0x2;

public double latitude, longitude;

Then, in your code write:

implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener

Finally,

if (googleApiClient.isConnected()) {
                LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        LocationRequest locationRequest = new LocationRequest();
        locationRequest.setInterval(3000);
        locationRequest.setFastestInterval(3000);
                locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                        .addLocationRequest(locationRequest);
         builder.setAlwaysShow(true);
         LocationServices.FusedLocationApi
                        .requestLocationUpdates(googleApiClient, locationRequest, this);
         PendingResult<LocationSettingsResult> result =
                        LocationServices.SettingsApi
                                .checkLocationSettings(googleApiClient, builder.build());
         result.setResultCallback(new ResultCallback<LocationSettingsResult>() {

                    @Override
                    public void onResult(LocationSettingsResult result) {
                        final Status status = result.getStatus();
                        switch (status.getStatusCode()) {
                            case LocationSettingsStatusCodes.SUCCESS:
                                    mylocation = LocationServices.FusedLocationApi
                                            .getLastLocation(googleApiClient);
                                    latitude = mylocation.getLatitude();
                                    longitude = mylocation.getlongitude();
                                }
                                break;
                    }
             }
       }

Try This, Hope it works. }

Ümañg ßürmån
  • 9,695
  • 4
  • 24
  • 41
0

Here you can found the documentation about that how to use Location Data from Google Maps -> https://developers.google.com/maps/documentation/android-sdk/location

And here you can found how to get last known location (it can be null if your device use it for the first time and for now it hasn't been saved) -> https://developer.android.com/training/location/retrieve-current#java

MrVasilev
  • 1,503
  • 2
  • 17
  • 34
0
private static final int REQUEST_LOCATION = 1;
private LocationManager locationManager;
//...

// In your onCreate
locationManager = (LocationManager) 
this.getSystemService(Context.LOCATION_SERVICE);

//...

void getLocation() {
    if (ActivityCompat.checkSelfPermission(this,
            android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this,
                    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
                        android.Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_LOCATION);

    } else {

        Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        if (location != null) {
            double lati = location.getLatitude();
            double longi = location.getLongitude();

            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            try {

             //You can retrieve any address you want like this...
                List<Address> addresses = geocoder.getFromLocation(lati, longi, 1);
                String address = addresses.get(0).getAdminArea() + ", " + addresses.get(0)
                        .getCountryName();

                location_text.setText(address);
                System.out.println(address);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//Create the location request and set the parameters
//To store parameters for requests to the fused location provider, create a LocationRequest.
// The parameters determine the level of accuracy for location requests.
//Create the location request and set the parameters
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case REQUEST_LOCATION:
            getLocation();
            break;
    }
}
olajide
  • 972
  • 1
  • 13
  • 26