#参考ページ
https://qiita.com/FlatMountain/items/cec2013bf095261277c9
以上のサイト以外にもいろいろなサイトを参考にしました。そのうえで私が詰まった部分をまとめます。
#つまりポイント
##1つめ
Android10から?パーミッションの取得が必要のようです。
requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 1);
これがわからずに1時間くらいはまりましたw
##2つめ
端末によってはバックグラウンドでのServiceが制限されるようです。
私のxiomi製端末を場合
【アプリアイコン長押し】→【アプリ情報】→【バッテリーセーバー】→ 「バッテリーセーバー(推奨)」→「制御しない」へ設定変更
で正常にバックグラウンドで動作するようになりました。中華制スマホは特にバックグラウンドでの動作が厳しくなっているので注意が必要です。
##そのほかの部分
Service内で歩数をカウントするがそれをリアルタイムでActivityに表示する方法としてApplicationクラスを使った。具体的にはinterfaceでリスナーを作りカウントするたびに呼び出すという方法。
public interface StepListener {
void onStep();
}
public class MyApplication extends Application {
private int step;
private long totalStep=0;
private StepListener stepListener;
public void setStep(int step){
this.step=step;
if (stepListener!=null) stepListener.onStep();
}
public long getTotalStep() {
return totalStep;
}
public void setTotalStep(long totalStep) {
this.totalStep = totalStep;
}
public int getStep(){
return step;
}
public void setStepListener(StepListener stepListener){
this.stepListener=stepListener;
}
}
//Service側
public class PedometerService extends Service {
private int mCounter=0;
private long totalStep=0;
MyApplication testApplication;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
testApplication=(MyApplication) getApplication();
testApplication.setStep(mCounter);
testApplication.setTotalStep(totalStep);
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
sensorManager.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
testApplication.setStep(mCounter++);
testApplication.setTotalStep(totalStep++);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, sensor, SensorManager.SENSOR_DELAY_UI);
return START_NOT_STICKY;
}
}
あとは表示したいActivityでStepListenerを実装した。
問題がある箇所もあるだろうが一応全体としてはこのような感じで実装した。
歩数を保存するタイミングについては500歩歩いたら保存するようにした。これはonDestroyが呼び出されずにServiceが終了してしまうことがあるためだ。もう一つは日付が変わるタイミングにalramをセットして値を保存する方式にした。
#まとめ
はじめてqiitaで記事を書いたのでいろいろとつたない部分がありますが読んでくださりありがとうございました。
#宣伝
歩数計も搭載した脳トレです。暇があれば遊んでみてください。