76 lines
2.8 KiB
Plaintext
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]
|