Location Manager remove updates permission

30,880

Solution 1

Since SDK 23, you should/need to check the permission before you call Location API functionality. Here is an example of how to do it:

if (locationManager != null) {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        locationManager.removeUpdates(GPSListener.this);
    }
}

There is checkSelfPermission(), which is to check if 'you' (this app) has the correct permissions. There is also checkPermission(), which is to check if another process has the correct permissions.

Notes

  • next to doing this runtime check, it is still also necessary to require the relevant permissions in the AndroidManifest.
  • if your targetSdk is < 23, you should use ContextCompat.checkSelfPermission() instead (thanks to JerryBrady)

Solution 2

I wasn't able to use checkSelfPermission(), because my min API is 14 and 23 is required. Knowing that, you can also try to catch a SecurityException.

Example:

try {
    locationManager.removeUpdates(GPSListener.this);
} catch (SecurityException e) {
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED");
}

Solution 3

To add to Jerry Brady's comment regarding ContextCompat, this is be the full code for < 23:

 if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
Share:
30,880
Madhukar Hebbar
Author by

Madhukar Hebbar

JAVA/Android developer in telecom domain

Updated on July 21, 2022

Comments

  • Madhukar Hebbar
    Madhukar Hebbar almost 2 years

    I am using android studio and compileSdkVersion is 23 in that i am using below code

     if(locationManager != null){
                locationManager.removeUpdates(GPSListener.this);
            }
    

    to stop gps update where GPS Listener is a class which implements LocationListener.

    but in removeUpdates line i am getting below lint warning

    Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or handle a potential SecurityException

    I am not getting what is the issue in the above code. Any extra permission need to be added in manifest file?.

    Regards.

  • Madhukar Hebbar
    Madhukar Hebbar over 8 years
    Question is for the target sdk version 23. There is no relation with min api.
  • Jerry Brady
    Jerry Brady over 8 years
    Question was for "compileSdkVersion 23" which does not mean the app is targeting 23. If you want backward compatibility with full Android M support, use ContextCompat.checkSelfPermission() instead and it will work.
  • Jerry Brady
    Jerry Brady over 8 years
    Note that if your target is < 23, you should use ContextCompat.checkSelfPermission() instead.
  • Rodrigo Borba
    Rodrigo Borba over 8 years
    I'm sorry. I didn't realize that. But I think that this option using try - catch still useful.
  • Dharma Sai Seerapu
    Dharma Sai Seerapu over 8 years
    This answer is helped me. But I think this was not a proper solution. But I upvoted it.
  • Glenn Bech
    Glenn Bech over 7 years
    I want to cry. Why would the app need a permission to remove an already attached locationlistener from the location manager?