2017-09-16 23 views
1

ドーズモードのときにアンドロイドアプリで位置情報を取得しようとしていますが、これはアンドロイド5.xに対応していました。アンドロイド6とドーズの出現で、私が何をしていても、アップデートはある時点で止まります。いくつかの記事を読んだ後と話題に答えをStackOverflowの私は、次の変更を加えた:ドーズモードでの位置情報の更新

  • フォアグラウンドサービス
  • がサービスを作った私のサービスを行って
  • 部分ウェイクロックを保持し、私は私のアプリを与えてくれましたWAKE_LOCK権限
  • は、私は私のアプリ
に対して無効バッテリーの最適化をしました(一部のアンドロイドのバグの回避策のための)個別のプロセス
  • にサービスの実行を作りました

    しかし、私はdozeが起動したときに位置更新を取得していません。Dozeが開始されたとき(メッセージを定期的に記録することによって)サービススレッドが実行を継続することを確認しました。 dozeとLocationManagerのドキュメントはこの点ではあまり意味がありません。だから私は、誰かがdozeでロケーションマネージャを存続させる方法を知っているのだろうかと思っていましたか? LocationManagerに定期的に呼び出された場合、LocationManagerをアクティブに保つ方法がありますか? 私はGPSアップデートだけに関心があります。アップデート頻度は毎秒1回です。

  • 答えて

    0

    には居眠りモードは、私は、問題の回避策を見つけたcom.android.internal.location.GpsLocationProviderのソースコードを読んだ後、私はそれ送ることに気づいありませんでしたcom.android.internal.location.ALARM_WAKEUPインテントは、位置情報提供者の居眠りを防止しました。だから私は、10秒ごとにテントをブロードキャスト居眠りからGPSを保つために、私は私のサービスクラスに次のように追加:

    [...] 
    private Handler handler; 
    private PowerManager powerManager; 
    
    private PendingIntent wakeupIntent; 
    private final Runnable heartbeat = new Runnable() { 
        public void run() { 
         try { 
          if (isRecording && powerManager != null && powerManager.isDeviceIdleMode()) { 
           LOG.trace("Poking location service"); 
           try { 
            wakeupIntent.send(); 
           } catch (SecurityException | PendingIntent.CanceledException e) { 
            LOG.info("Heartbeat location manager keep-alive failed", e); 
           } 
          } 
         } finally { 
          if (handler != null) { 
           handler.postDelayed(this, 10000); 
          } 
         } 
        } 
    }; 
    
    @Override 
    public void onCreate() { 
        handler = new Handler(); 
        wakeupIntent = PendingIntent.getBroadcast(getBaseContext(), 0, 
         new Intent("com.android.internal.location.ALARM_WAKEUP"), 0); 
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
        powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TrackService"); 
        [...] 
    } 
    
    0

    アプリケーションの動作は、正確にはdozeが停止するように設計されています。 Android 6で導入されたDozeは、アクティビティをメンテナンスウィンドウに遅らせることで、デバイスの電力使用量を削減します。 GPSは巨大なパワードローであり、ドーズモードで常時動作することはできません。これが許可されていれば、画面がオンの場合と同様の速度でバッテリーが消耗する可能性があります。ネットワークトラフィックの最適化はバッテリ寿命の向上を達成しません。 GPS位置情報の更新を1秒ごとに行う場合は、デバイスがドーズモードに入るのを停止する必要があります。

    最後にアンドロイド5.

    +0

    私が居眠り何を知ってるのためである、しかしそれは_my_デバイスだと私のことができるようになり私にとって有用な目的のためにバッテリーを消耗させてもいいと宣言します。この場合、GPSトラックを記録します。それはまた、珍しいユースケースでもありません。例えば、ランキーパとストラヴァは同じことをする必要があります。デバイスがドーズに入るのを止めることはハックだと思われ、バッテリーの寿命を延ばすためのものと戦うために画面をオンにしなければならないのは、私にとっては逆のようです。 –

    +0

    @ KorneliusElstnerデバイスを使用している場合は、ドーズモードにはなりません。ユーザーがデバイスを動かして目を覚ますと、システムはDozeを終了し、すべてのアプリケーションは通常の動作に戻ります。 – mattm

    関連する問題