¿Cómo determina Android si una aplicación tiene "uso de batería alta" en "Solicitudes de ubicación recientes"?

StackOverflow https://stackoverflow.com//questions/20012518

Pregunta

ASO de KITKAT (4.4) Android informa que mi aplicación es "uso de batería alta".

Yo uso la ubicación de la red, así como GPS.Si deshabilito GPS, entonces parece que la aplicación se marca como "uso de batería baja".

Me pregunto si hay algún consejo para usar GPS mientras mantiene la etiqueta de "uso de batería baja".Tal vez si se le encoge con poca frecuencia, ¿o está codificado para GPS= Killer de batería?

Editar:

Entiendo que cambiar esos parámetros conservarán la vida útil de la batería.Mi pregunta fue más de si Android reconocerá estos intentos de conservación de la vida de la batería o simplemente marca mi aplicación como un uso de alta potencia simplemente porque utiliza GPS.

¿Fue útil?

Solución

Utilicé el ubicación fusionada (y [Enlace eliminado ]) y después de un día entero de obtener la ubicación una vez en cada minuto, mi aplicación utilizó aproximadamente el 4% de la batería.

(el enlace anterior es ahora un estacionamiento que intenta instalar la extensión del navegador: http://kpbird.com/2013/06/fused-location-provider-example.html?m=1 )

Otros consejos

buena pregunta pero repetitiva. Sí, la frecuencia de sondeo lo afecta mucho. Por lo tanto, la frecuencia de obtener las actualizaciones de ubicación del usuario debe adaptarse de acuerdo con las necesidades específicas.

  1. Básicamente, lees la documentación de Android de requestLocationUpdates de locationmanager , dice:

    requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)

    Elegir un valor razonable para mintime es importante conservar la vida útil de la batería. Cada actualización de la ubicación requiere energía de GPS, WiFi, celda y otras radios. Seleccione un valor de MINTIME lo más alto posible y que aún esté proporcionando una experiencia de usuario razonable. Si su aplicación no está en primer plano y muestra la ubicación al usuario, su solicitud debe evitar el uso de un proveedor activo (como Network_Provider o gps_provider), pero si insiste, luego seleccione una mimenta de 5 * 60 * 1000 (5 minutos) o mayor que. Si su aplicación está en primer plano y muestra la ubicación al usuario, es apropiado seleccionar un intervalo de actualización más rápido.

    El parámetro Mindistance también se puede usar para controlar la frecuencia de las actualizaciones de ubicación. Si es mayor que 0, el proveedor de ubicación solo enviará su solicitud una actualización cuando la ubicación haya cambiado al menos medidores de Ministancia, y al menos Mintime Millisegunds ha pasado. Sin embargo, es más difícil para los proveedores de ubicación ahorrar energía utilizando el parámetro Mindistance, por lo que Mintime debe ser la herramienta principal para conservar la vida útil de la batería .

  2. Lea lo siguiente para obtener algunas buenas respuestas para saber cómo se drena y qué se puede hacer para minimizar el drenaje de la batería:

    Android Regular GPS sondeo en servicio, maximizando la vida útil de la batería < / a>

    ¿Cuál es el enfoque más eficiente en la batería? ¿De usar UbicaciónClient para obtener actualizaciones periódicamente?

    Buena forma de obtener la ubicación del usuario en Android

    Ahorre la energía de la batería consumida por los servicios GPS en Android

    ¿El proveedor de ubicación es realmente un drenaje de la batería?

    Duración de la batería Si usa el GPS y la aplicación de fondo iOS / Android

    Mantener un servicio de GPS vivo y optimizando la vida útil de la batería

  3. Espero que esto ayude.

    Editar: Estoy de acuerdo en @ioan. Ahora puede usar API de ubicación fusionada para obtener la ubicación de forma fácil y eficiente.

Refactorizado recientemente para obtener la ubicación del código, aprender algunas buenas ideas y, finalmente, logró una biblioteca y una demo relativamente perfectas.

//request all valid provider(network/gps)
private boolean requestAllProviderUpdates() {
    checkRuntimeEnvironment();
    checkPermission();

    if (isRequesting) {
        EasyLog.d("Request location update is busy");
        return false;
    }


    long minTime = getCheckTimeInterval();
    float minDistance = getCheckMinDistance();

    if (mMapLocationListeners == null) {
        mMapLocationListeners = new HashMap<>();
    }

    mValidProviders = getValidProviders();
    if (mValidProviders == null || mValidProviders.isEmpty()) {
        throw new IllegalArgumentException("Not available provider.");
    }

    for (String provider : mValidProviders) {
        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                if (location == null) {
                    EasyLog.e("LocationListener callback location is null.");
                    return;
                }
                printf(location);
                mLastProviderTimestamp = location.getTime();

                if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                    finishResult(location);
                } else {
                    doLocationResult(location);
                }

                removeProvider(location.getProvider());
                if (isEmptyValidProviders()) {
                    requestTimeoutMsgInit();
                    removeUpdates();
                }
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }

            @Override
            public void onProviderEnabled(String provider) {
            }

            @Override
            public void onProviderDisabled(String provider) {
            }
        };
        getLocationManager().requestLocationUpdates(provider, minTime, minDistance, locationListener);
        mMapLocationListeners.put(provider, locationListener);
        EasyLog.d("Location request %s provider update.", provider);
    }
    isRequesting = true;
    return true;
}

//remove request update
public void removeUpdates() {
    checkRuntimeEnvironment();

    LocationManager locationManager = getLocationManager();
    if (mMapLocationListeners != null) {
        Set<String> keys = mMapLocationListeners.keySet();
        for (String key : keys) {
            LocationListener locationListener = mMapLocationListeners.get(key);
            if (locationListener != null) {
                locationManager.removeUpdates(locationListener);
                EasyLog.d("Remove location update, provider is " + key);
            }
        }
        mMapLocationListeners.clear();
        isRequesting = false;
    }
}

Implementación completa: https://github.com/bingerz/fastlocation/blob/master/fastlocationlib/src/main/java/cn/bingerz/fashionlocation/fashionlocation.java

Mark:

  • Cada solicitud para completar la ubicación, es mejor removerDates, de lo contrario, la barra de estado del teléfono siempre mostrará el icono de posicionamiento
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top