diff options
| author | 2012-09-13 13:20:59 -0700 | |
|---|---|---|
| committer | 2012-09-13 14:17:41 -0700 | |
| commit | 4fab68b5324e1f9b6765cdc33e66d1f074623dc2 (patch) | |
| tree | 96d99f6794718101b1cbb52c72af154d2b0790e9 | |
| parent | aefd73d2b9f17a06f05346f302db1e393a7ece19 (diff) | |
Require ACCESS_FINE_LOCATION for Geofence use.
Bug: 7153226
Change-Id: I49236379e739fcda66bbc9a31cfdca9a87122aec
| -rw-r--r-- | location/java/android/location/LocationManager.java | 27 | ||||
| -rw-r--r-- | services/java/com/android/server/LocationManagerService.java | 15 |
2 files changed, 35 insertions, 7 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index bef363b75b8b..b127b53bda04 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -994,6 +994,12 @@ public class LocationManager { * <p> Internally, this method uses both {@link #NETWORK_PROVIDER} * and {@link #GPS_PROVIDER}. * + * <p>Before API version 17, this method could be used with + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or + * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. + * From API version 17 and onwards, this method requires + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission. + * * @param latitude the latitude of the central point of the * alert region * @param longitude the longitude of the central point of the @@ -1005,7 +1011,8 @@ public class LocationManager { * @param intent a PendingIntent that will be used to generate an Intent to * fire when entry to or exit from the alert region is detected * - * @throws SecurityException if no suitable permission is present + * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} + * permission is not present * * @deprecated Use {@link LocationRequest} and {@link Geofence} instead */ @@ -1055,7 +1062,8 @@ public class LocationManager { * * @throws IllegalArgumentException if fence is null * @throws IllegalArgumentException if intent is null - * @throws SecurityException if no suitable permission is present + * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} + * permission is not present */ public void addGeofence(LocationRequest request, Geofence fence, PendingIntent intent) { checkPendingIntent(intent); @@ -1071,11 +1079,18 @@ public class LocationManager { /** * Removes the proximity alert with the given PendingIntent. * + * <p>Before API version 17, this method could be used with + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or + * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. + * From API version 17 and onwards, this method requires + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission. + * * @param intent the PendingIntent that no longer needs to be notified of * proximity alerts * * @throws IllegalArgumentException if intent is null - * @throws SecurityException if no suitable permission is present + * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} + * permission is not present * * @deprecated Use {@link LocationRequest} and {@link Geofence} instead */ @@ -1102,7 +1117,8 @@ public class LocationManager { * * @throws IllegalArgumentException if fence is null * @throws IllegalArgumentException if intent is null - * @throws SecurityException if no suitable permission is present + * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} + * permission is not present */ public void removeGeofence(Geofence fence, PendingIntent intent) { checkPendingIntent(intent); @@ -1122,7 +1138,8 @@ public class LocationManager { * @param intent a pending intent previously passed to {@link #addGeofence} * * @throws IllegalArgumentException if intent is null - * @throws SecurityException if no suitable permission is present + * @throws SecurityException if {@link android.Manifest.permission#ACCESS_FINE_LOCATION} + * permission is not present */ public void removeAllGeofences(PendingIntent intent) { checkPendingIntent(intent); diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index c26448f81618..197f6ab63860 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -588,7 +588,17 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } throw new SecurityException("Location requires either ACCESS_COARSE_LOCATION or" + - "ACCESS_FINE_LOCATION permission"); + " ACCESS_FINE_LOCATION permission"); + } + + /** + * Throw SecurityException if caller lacks permission to use Geofences. + */ + private void checkGeofencePermission() { + if (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) != + PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Geofence usage requires ACCESS_FINE_LOCATION permission"); + } } /** @@ -1096,6 +1106,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run public void requestGeofence(LocationRequest request, Geofence geofence, PendingIntent intent, String packageName) { if (request == null) request = DEFAULT_LOCATION_REQUEST; + checkGeofencePermission(); checkPermissionAndRequest(request); checkPendingIntent(intent); checkPackageName(packageName); @@ -1114,7 +1125,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run @Override public void removeGeofence(Geofence geofence, PendingIntent intent, String packageName) { - checkPermission(); + checkGeofencePermission(); checkPendingIntent(intent); checkPackageName(packageName); |