Search code examples
androidgpsandroid-locationlocationlistener

onlocationchanged not called in Android


I'm trying to get current device location using LocationListener method in Android. In some phones it doesn't work or onlocationchanged is not called. How do I get location in such cases ? In oncreate :

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 0, this);
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

and this

@Override
    public void onLocationChanged(Location location) {

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        Log.e("TAG","lat and long "+latitude+" "+longitude);
}

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }

But onLocationChanged is not called in versions below Marshmallow


Solution

  • use this code worked in all devices and tested:

     private void getCurrentLocation() {
    //        Log.e("getLocation","Called");
    
            LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
            LocationListener locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    mlat = location.getLatitude();
                    mlon = location.getLongitude();
           String mLogn = Double.toString(mlon);
                   String mLatd = Double.toString(mlat);
    //                Log.e("mLogn",""+mLogn);
    //                Log.e("mLatd",""+mLatd);
                    mLogn=mLogn.trim();
                    mLatd=mLatd.trim();
                    if (mLatd==null || mLogn==null) {
                        if (mLatd.isEmpty()) {
                            mLatd = "No data found";
                        }
                        if (mLogn.isEmpty()) {
                            mLogn = "No data found";
                        }
                    }
    
                    // Log.e("Location",""+mlon+" "+mlat);
    //                Toast.makeText(CampaignTrain.this, "your location is " + mLogn + " " + mLatd, Toast.LENGTH_SHORT).show();
    
                }
    
                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {
    
                }
    
                @Override
                public void onProviderEnabled(String s) {
    
                }
    
                @Override
                public void onProviderDisabled(String s) {
    
                }
            };
            String locationProvide = LocationManager.NETWORK_PROVIDER;
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_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.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},COARSE_LOCATION_REQUEST_CODE);
                    return;
                }
    
    
            }
            if ( ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_REQUEST_CODE);
                    return;
                }
    
            }
            locationManager.requestLocationUpdates(locationProvide, 0, 0, locationListener);
            Location lastLocation=locationManager.getLastKnownLocation(locationProvide);
    
    
        }
    

    and set the runtime permission :

    int FINE_LOCATION_REQUEST_CODE=101;
    int COARSE_LOCATION_REQUEST_CODE=102;
    
         public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
                switch (requestCode)
                {
    
                   case COARSE_LOCATION_REQUEST_CODE:
                    {
                        if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
                        {
    
                        }
                        else
                        {
                            mLatd="User denied location";
                            mLogn="User denied location";
                        }
                        return;
                    }
                    case FINE_LOCATION_REQUEST_CODE:
                    {
                        if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
                        {
    
                        }
                        else
                        {
                            mLatd="User denied location";
                            mLogn="User denied location";
                        }
                        return;
                    }
                }
            }