androidgpslocationmanagerandroid-gps

Meaning of Criteria.POWER_LOW for LocationManager


The Criteria class is not documented in much detail.
Can someone please explain what POWER_HIGH and POWER_LOW change exactly?
Is it about battery drainage?

criteria.setPowerRequirement(Criteria.POWER_LOW);                
criteria.setAccuracy(Criteria.ACCURACY_FINE);
...
locationManager.requestSingleUpdate(criteria, locationListener, null);

Update: I went through some of the source code. It turns out this parameter is ignored in my example because an accuracy is set as well.

createFromDeprecatedCriteria() in LocationRequest.java:

    ...
    int quality;
    switch (criteria.getAccuracy()) {
        case Criteria.ACCURACY_COARSE:
            quality = ACCURACY_BLOCK;
            break;
        case Criteria.ACCURACY_FINE:
            quality = ACCURACY_FINE;
            break;
        default: {
            if (criteria.getPowerRequirement() == Criteria.POWER_HIGH) {
                quality = POWER_HIGH;
            } else {
                quality = POWER_LOW;
            }
        }
    }
    ...

Solution

  • There are a number of different LocationProviders (gps, network, passive etc). The Criteria class can be used by the LocationManger to automatically select the best provider based on your requirements.

    Criteria criteria = new Criteria();
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setSpeedRequired(true);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(false);
    
    return locationManager.getBestProvider(criteria, true);
    

    How the Criteria class is actually used can be seen here here. Setting the power requirement to Criteria.POWER_LOW would probably just rule out the device using the GPS location provider (since it uses far more battery than the other passive types).