rspec/rules/S6914/java/rule.adoc

76 lines
2.8 KiB
Plaintext

Location awareness is a common feature for mobile application that enhance the user experience by providing context-specific services.
== Why is this an issue?
The location awareness feature can significantly drain the device's battery.
The recommended way to maximize the battery life is to use the _fused location provider_
which combines signals from GPS, Wi-Fi, and cell networks, as well as accelerometer, gyroscope, magnetometer and other sensors.
The `FusedLocationProviderClient` automatically chooses the best method to retrieve a device's location based on the device's context.
The rule flags an issue when `android.location.LocationManager` or `com.google.android.gms.location.LocationClient`
is used instead of `com.google.android.gms.location.FusedLocationProviderClient`.
=== What is the potential impact?
* _Usability_: the non-optimized location API consumer more battery.
* _Sustainability_: the extra energy required has a negative impact on the environment.
== How to fix it
Replace the usages of `android.location.LocationManager` or `com.google.android.gms.location.LocationClient`
with `com.google.android.gms.location.FusedLocationProviderClient`.
=== Code examples
==== Noncompliant code example
[source,java,diff-id=1,diff-type=noncompliant]
----
public class LocationsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Noncompliant
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Use the location object as needed
}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
}
----
==== Compliant solution
[source,java,diff-id=1,diff-type=compliant]
----
public class LocationsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // Compliant
fusedLocationClient.getLastLocation()
.addOnSuccessListener(this, location -> {
// Use the location object as needed
});
}
}
----
== Resources
=== Documentation
* https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient.html[Google Play Services - FusedLocationProviderClient]
* https://developer.android.com/develop/sensors-and-location/location/battery[Android Developers - Optimize location for battery]
* https://developer.android.com/reference/android/location/package-summary[Android Developers - Android Location]