-1

i want to use GPS in my App. but when i tried to retrieve GPS readings as shown belwo in the code, Android studio gave me the belwo mentioned error

despit all the required permissions are added to manifest file

code:

LocationManager lm = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
    LocationListener ll = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Log.w(TAG, "onLocationChanged");
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.w(TAG, "onStatusChanged");

        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.w(TAG, "onProviderEnabled");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.w(TAG, "onProviderDisabled");
        }
    };
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);//error at this line

enter image description here

Amrmsmb
  • 1
  • 27
  • 104
  • 226
  • 1
    https://stackoverflow.com/questions/32635704/cant-get-the-permission – CommonsWare Nov 20 '15 at 15:36
  • @CommonsWare but all the permissions are added. – Amrmsmb Nov 20 '15 at 15:38
  • 1
    Quoting my answer: "For these permissions, not only does your targetSdkVersion 23+ app need to have the element(s), but **you also have to ask for those permissions at runtime from the user on Android 6.0+ devices, using methods like checkSelfPermission() and requestPermissions()**." (emphasis added) – CommonsWare Nov 20 '15 at 15:42
  • @CommonsWare - vote to close / re: duplicate – KevinDTimm Nov 20 '15 at 15:44
  • @KevinDTimm: The question my answer is on is due to a `SecurityException`, not a Lint check as in this question. The answer is the same, but the question strictly isn't. – CommonsWare Nov 20 '15 at 15:45
  • @CommonsWare - I saw that but, given your comments felt that duplicate (answer) was 'ok' – KevinDTimm Nov 20 '15 at 15:48

1 Answers1

1

This is due to in Marshmallow (Android version 6.0) Users can choose to turn off permissions. Simply wrap this check to see if the permission is enabled before your location code.

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

}

You should also write in an else statement request code which will request the permission from the user if they haven't got it.

Here's a nice request permissions method:

public void requestPermissions(List<String> permissions, ActivityCompat.OnRequestPermissionsResultCallback onRequestPermissionsResultCallback) {
    String[] params = permissions.toArray(new String[permissions.size()]);
    requestPermissions(params, onRequestPermissionsResultCallback);
}

In your case you will have to pass it the Location permissions which you can get with this method:

private List<String> getRequiredLocationPermissions() {
    String accessCoarsePermission = android.Manifest.permission.ACCESS_COARSE_LOCATION;
    String accessFineLocationPermission = android.Manifest.permission.ACCESS_FINE_LOCATION;
    int hasCoarsePermission = ContextCompat.checkSelfPermission(getActivity(), accessCoarsePermission);
    int hasFineLocationPermission = ContextCompat.checkSelfPermission(getActivity(), accessFineLocationPermission);
    List<String> permissions = new ArrayList<>();
    if (hasCoarsePermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(accessCoarsePermission);
    }
    if (hasFineLocationPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(accessFineLocationPermission);
    }
    return permissions;
}
fasteque
  • 4,309
  • 8
  • 38
  • 50
vguzzi
  • 2,420
  • 2
  • 15
  • 19