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.
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)
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");
}
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)
Here is my solution !
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|| checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
lm.removeUpdates(this);
}
}
else
{
lm.removeUpdates(this);
}