0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

android studioを使って歩数計を作って詰まった部分と余談

Posted at

#参考ページ
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で記事を書いたのでいろいろとつたない部分がありますが読んでくださりありがとうございました。
#宣伝
歩数計も搭載した脳トレです。暇があれば遊んでみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?