Serviceを読んで理解し、同意したものとみなします。7,371件0Androidでサービスを作成して、その中で歩数計センサー(TYPE_STEP_DETECTOR)を使用して歩数をカウントしています。アプリを起動しているときは問題なくカウントされるのですが、スリープ状態(画面が真っ暗の状態)のときにカウントが極端に少ない場合がありました。スリープ状態だと必ずカウントが少ないというわけではないのですが、再現パターンがいまいちわかりません。カウントがされない原因がわからないのですが、スリープ状態だと歩数計センサーが作動しなくなるとかあるのでしょうか?アドバイスをよろしくお願い致します。票1アプリがDozeモードに入ることによって、カウントがされなくなっていると思われます。Dozeモードは簡単に説明すると、電池の消費を抑えるために端末を使用していない場合は、ほぼ全ての処理を止めて節電モードに入る機能です。6.0から導入されました。7.0からは静止状態でなくてもDozeモードに入るようになりました。Dozeモード中もアプリを動作し続ける方法は公式のドキュメントにも記載されているので確認してください。非常によくまとまっているので、参考にしてみてください。対策としては、ホワイトリストへの登録が良いかと思います。個の銅バッジご教授ありがとうございます。|1(コメント欄に収まらなかったので回答欄を使用します)Takeruさんのご回答はAndroid側がSleep状態であるとSensorは動かず、Android6.0以降のDozeおよびAppStandbyの仕組みによりSleepされる契機が増えたというご回答になりますそれはそれで事実なのですが、「アプリが動ける条件」と「Sensorが動ける条件」は微妙に違います。Android4.4より追加されたSensorBatchingにより、Android側のprocessor(以下APとします)がSleep状態でもSensor側のチップで情報を蓄積しAP側がSleep解除時にSensor側で持っていた情報を一気に渡す仕組みが出来ました。これによりDozeモード等でアプリ側が動けなくてもSensor側で情報を蓄積し、ユーザーがアプリを表示したタイミング等でヒストリカルに情報を取得することができます。FIFOの限界量(蓄積情報の限界量)より前に蓄積されていた古い情報は消えます。(Android4.4時に色々な端末を見た限りではほぼ対応していませんでした。具体的なデータがなくて申し訳ないですが・・・)要はAndroidのソフト仕様ではなく、各端末のハード仕様で挙動が変わってしまい上記方法で自分用に作るアプリならまだしも、GooglePlayでさまざまな端末向けに公開するようなアプリを対応するのは難しいかと思います。アプローチは変わりますが、SignificantSensor(TYPE_SIGNIFICANT_MOTION)というSensorがあります。これはAPがSleep時でも動作が可能で、かつAPにTriggerを送ることがCDDで保障されているSensorになります。Sensor)アプリ側でSleepを検知したら、SignificantSensorを貼り、歩きだしタイミングでAPを起こすというアプローチは可能かと思います。(もちろんSensorBatchingのアプローチと比べ消費電力観点でよいとは言えません。個の銅バッジちょっと気になったのでコメントします。(電池の消費問題は無視するとして)PARTIAL_WAKE_LOCKなどでCPUをスリープに入らないように設定した場合はどうなるのでしょう?OSとしてスリープに入らない状態でもハードのチップは独自に停止したりするのでしょうか。OSがスリープ->HAL経由でチップへの停止要求のようなシーケンスがあるのかと思いました。6:341HAL以下の実装がメーカによって異なってしまうので一様な回答はできませんが、以前見たときは「APのスリープ状態に依存しない」「APのスリープがかかった時点でSensorを停止」「APがスリープに入っていなくとも画面OFFした時点でSensorを停止」という3パターンがありました。(Sensor毎にも動作差異がありますし、同じSensorでもメーカー毎に差異がありました。ちなみにiPhoneはM7にてAPが停止していても動作可能なようです。iOSのこの動きに追従しようとしたSensorBatching仕様だと思うのですが、CDDに規定されていない部分なのでメーカーが余り追従していないように思えます。7:17なるほど、Sensor側(Driver?)の実装次第でスリープの挙動が決まるということですね。OSからスリープを要求するIFがあってもそれでスリープするかどうかはSensorの実装依存となる(というパターンもあった)。CDDでも要求されてない仕様であればメーカの裁量で決めて良い部分でしょうし、絶対にSensorを止めないといった強い指定はアプリからは難しそうですね。7:58メモ:コメント削除されてしまいましたがsinsinさんのミスオペでマイナス評価をおしてしまったとのことです。件のコメントを表示0自己レスです。Android6.0)で再現性があることがわかりました。画面OFFにして、歩くと必ず歩数が極端に少なくなりました。そこで、Sensor.TYPE_STEP_DETECTORではなくてSensor.TYPE_STEP_COUNTERにして、端末起動してからの累計歩数を保存しつつ、前回保存した累計歩数との差を歩数とするようにしました。すると、画面OFFにしてもそれなりにカウントされるようになりました。TYPE_STEP_DETECTORよりTYPE_STEP_COUNTERを使用したほうがよいのでしょうか?不可解なのですが、TYPE_STEP_COUNTERを使用することにしました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。