Google is informing by email of changes to the Android location permissions:
We’re making a change on October 15th, 2016 that will affect apps targeting API version 21 (Android 5.0, Lollipop) or higher that use ACCESS_FINE_LOCATION but don't explicitly have the "android.hardware.location.gps" uses-feature. Going forward, these apps will be available to install on devices that don't have GPS hardware. In most cases this won't be an issue since Wi-Fi and Cell-ID based location provides high enough fidelity for the typical operation of these apps. However, any apps that require GPS hardware, such as GPS navigators, should explicitly add the "android.hardware.location.gps" uses-feature to their manifest.
If your app requires GPS to function properly and you do not include in your manifest declaration, your users may have a poor app experience.
Also, if you’re using the fused location provider and wish to receive the most accurate location samples from GPS (i.e. with PRIORITY_HIGH_ACCURACY), you must include the "android.hardware.location.gps" feature in your app’s manifest to ensure that Google Play only distributes your app to devices with GPS sensors.
You can read more about this change in the Android Developers Help Center.
From the Android Developers Help Center
In order to receive location updates from NETWORK_PROVIDER or GPS_PROVIDER, you must request the user's permission by declaring either the ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission, respectively, in your Android manifest file. Without these permissions, your application will fail at runtime when requesting location updates.
If you are using both NETWORK_PROVIDER and GPS_PROVIDER, then you need to request only the ACCESS_FINE_LOCATION permission, because it includes permission for both providers. Permission for ACCESS_COARSE_LOCATION allows access only to NETWORK_PROVIDER.
Caution: If your app targets Android 5.0 (API level 21) or higher, you must declare that your app uses the android.hardware.location.network or android.hardware.location.gps hardware feature in the manifest file, depending on whether your app receives location updates from NETWORK_PROVIDER or from GPS_PROVIDER. If your app receives location information from either of these location provider sources, you need to declare that the app uses these hardware features in your app manifest. On devices running verions prior to Android 5.0 (API 21), requesting the ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission includes an implied request for location hardware features. However, requesting those permissions does not automatically request location hardware features on Android 5.0 (API level 21) and higher.
I am using the fused location provider, targeting API 21, and using ACCESS_FINE_LOCATION
. I don't specifically care whether GPS is available, only that the most accurate location is reported.
android.hardware.location.gps
and android.hardware.location.network
. Or is this only for LocationManager
and not fused location?Do I need android.hardware.location.gps
and android.hardware.location.network
or not?
The second quotation is telling you that you need either android.hardware.location.network
or android.hardware.location.gps
, if you specifically need one or the other location provider.
If you want updates via GPS, you need android.hardware.location.gps
.
If you want updates via the WiFi and cellular networks, you need android.hardware.location.network
.
If you want updates from both the network and GPS, you should include both <uses-feature>
elements.
If you don't specify either, your device may be installed on devices without that provider. For example, it may be installed on a device without a GPS, cellular network, or Wi-Fi chip.
In other words, getting location requires either the network location feature or the GPS feature. If you don't declare that your application needs one or the other, you may not get location updates at all.
API 21 vs 20 and below
Note that the above is only true for API 21 and above.
Prior to API 21, requesting the ACCESS_COARSE_LOCATION
permission implied the location.network
feature, wheras requesting ACCESS_FINE_LOCATION
implied the location.gps
feature (see <uses-feature>
).
The only change right now is that, for API 21+, any app requesting ACCESS_FINE_LOCATION
will soon be available to install on devices without GPS. If your app previously assumed GPS was available (and needs GPS), you need to make sure you have the explicit request for android.hardware.location.gps
.
Google says that network location providers are now good enough for a fine location, thus, the change.