web-dev-qa-db-ja.com

Androidは、アプリの[最近の位置情報のリクエスト]の下に[バッテリー使用量が多い]があるかどうかをどのように判断しますか?

KitKat(4.4)の時点で、Androidは、私のアプリが「バッテリー使用量が多い」と報告しています。

私はGPSだけでなくネットワークロケーションも使用しています。 GPSを無効にすると、アプリが「バッテリー使用量が少ない」とマークされているようです。

「バッテリー使用量が少ない」というラベルを付けたままGPSを使用するためのヒントはないかと思います。おそらく、ポーリングの頻度が十分でない場合、またはGPS =バッテリーキラーにハードコードされている場合はどうでしょうか?

編集:

これらのパラメータを変更すると、バッテリーの寿命が延びることを理解しています。私の質問は、Androidがバッテリー寿命を節約するこれらの試みを認識するのか、それともGPSを使用しているという理由だけでアプリを高電力使用としてブランド化するのかということでした。

13
Martin Konecny

Fused Location (および[link removed])を使用し、1分に1回場所を取得してから、私のアプリケーションはバッテリーの約4%を使用しました。

(以前のリンクは、ブラウザ拡張機能をインストールしようとする駐車場になりました: http://kpbird.com/2013/06/fused-location-provider-example.html?m=1

5
ioan ghip

良い質問ですが、繰り返します。はい、ポーリングの頻度はバッテリーの寿命に大きく影響します。したがって、ユーザーの位置情報の更新を取得する頻度は、特定のニーズに応じて調整する必要があります。

  1. 基本的に、 LocationManagerrequestLocationUpdatesのAndroidドキュメントを読んでいますか?

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

    minTimeの適切な値を選択することは、バッテリー寿命を節約するために重要です。各ロケーションの更新には、GPS、WIFI、セル、およびその他の無線からの電力が必要です。妥当なユーザーエクスペリエンスを提供しながら、できるだけ高いminTime値を選択します。アプリケーションがフォアグラウンドになく、ユーザーに場所を表示していない場合、アプリケーションはアクティブなプロバイダー(NETWORK_PROVIDERやGPS_PROVIDERなど)の使用を避ける必要がありますが、主張する場合は、minTime 5 * 60 * 1000(5分)または大きい。アプリケーションがフォアグラウンドにあり、ユーザーに場所を表示している場合は、より速い更新間隔を選択するのが適切です。

    MinDistanceパラメーターを使用して、位置の更新の頻度を制御することもできます。 0より大きい場合、ロケーションプロバイダーは、ロケーションが少なくともminDistanceメートル変更され、少なくともminTimeミリ秒が経過した場合にのみ、アプリケーションに更新を送信します。ただし、ロケーションプロバイダーがminDistanceパラメーターを使用して電力を節約することはより困難であるため、minTimeをバッテリー寿命を節約するための主要なツールにする必要があります。

  2. バッテリーの消耗を最小限に抑えるために何ができるかを知るためのいくつかの良い答えについては、以下をお読みください。

    Androidの定期的なGPSポーリングサービス、バッテリー寿命の最大化

    LocationClientを使用して定期的に更新を取得する最もバッテリー効率の高いアプローチは何ですか?

    Androidでユーザーの位置を取得する良い方法

    Androidのgpsサービスによって消費されるバッテリー電力を節約します

    ロケーションプロバイダーは本当にバッテリーの消耗ですか?

    GPSとバックグラウンドアプリios/Androidを使用している場合のバッテリー寿命

    GPSサービスを存続させ、バッテリー寿命を最適化する

お役に立てれば。

編集:@ ioanに同意します。これで、Fused Location APIを使用して、場所を簡単かつ効率的に取得できます。

14
Shobhit Puri

最近、コードの場所を取得するためにリファクタリングされ、いくつかの優れたアイデアを学び、最終的に比較的完璧なライブラリとデモを実現しました。

//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;
    }
}

完全な実装: https://github.com/bingerz/FastLocation/blob/master/fastlocationlib/src/main/Java/cn/bingerz/fastlocation/FastLocation.Java

マーク:

  • 場所を完了するための各リクエストでは、Updatesを削除することをお勧めします。そうしないと、電話のステータスバーに常に位置アイコンが表示されます
0
Bingerz