Androidのセンサー「TYPE_STEP_COUNTER」で歩数計を作るテスト

Androidのセンサー「TYPE_STEP_COUNTER」を使って歩数を取得するサンプルを作ってみました。

ソースはGitHubに置いてあるので、興味がある方はご覧ください。中身の説明はこの記事の下の方でしています。

okuzawats/android-pedometer-sample: TYPE_STEP_COUNTERを使ったアプリのサンプルです。

Androidの「TYPE_STEP_COUNTER」

TYPE_STEP_COUNTERは、センサーにアクセスした時から端末のシャットダウンまで、歩数を計測してくれます。float値ですが、小数点以下は全て0です。何故、int値でないのかは不明です。

A constant describing a step counter sensor.

A sensor of this type returns the number of steps taken by the user since the last reboot while activated.

出典:Sensor | Android Developers

TYPE_STEP_COUNTERは、Android 4.4で導入されました。Android 4.4以降を搭載している一部の端末で使えるようです。私のVaio Phone(VA-10J)は使えました。

TYPE_STEP_COUNTERのサンプル

まずはTYPE_STEP_COUNTERに対応しているか確認します。KitKat(Android 4.4)以上、かつ端末がTYPE_STEP_COUNTERに対応していれば、trueにします。

//KITKAT以上かつTYPE_STEP_COUNTERが有効ならtrue
boolean isTarget = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT 
  && getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER);

if (isTarget) {
    //TYPE_STEP_COUNTERが有効な場合の処理
} else {
    //TYPE_STEP_COUNTERが無効な場合の処理
}

あとは、

  • getSystemService(SENSOR_SERVICE)でSensorManagerを取得
  • SensorManager#getDefaultSensor(Sensor.TYPE_STEP_COUNTER)でTYPE_STEP_COUNTERを取得
  • Sensorのリスナーを登録
  • リスナーから取得した値をTextViewに表示

という感じですが、コードを貼っておかないとわからないですね。まずはレイアウト用のxmlの方でTYPE_STEP_COUNTERの値を表示させたいTextViewのidを”pedometer”にしておいて、こんな感じで実装していきます。

public class MainActivity extends AppCompatActivity {

    private TextView mStepCounterText;
    private SensorManager mSensorManager;
    private Sensor mStepCounterSensor;
    private float steps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStepCounterText = (TextView) findViewById(R.id.pedometer);
        steps = 0;
    }

    @Override
    protected void onResume() {
        super.onResume();

        //KITKAT以上かつTYPE_STEP_COUNTERが有効ならtrue
        boolean isTarget = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
                && getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER);

        if (isTarget) {
            //TYPE_STEP_COUNTERが有効な場合の処理
            Log.d("hasStepCounter", "STEP-COUNTER is available!!!");
            mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            mStepCounterSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

            setStepCounterListener();
        } else {
            //TYPE_STEP_COUNTERが無効な場合の処理
            Log.d("hasStepCounter", "STEP-COUNTER is NOT available.");
            mStepCounterText.setText("STEP-COUNTER is NOT available.");
        }

    }

    private void setStepCounterListener() {
        if (mStepCounterSensor != null) {
            //ここでセンサーリスナーを登録する
            mSensorManager.registerListener(mStepCountListener, mStepCounterSensor, SensorManager.SENSOR_DELAY_FASTEST);
        }
    }

    private final SensorEventListener mStepCountListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            //センサーから取得した値をテキストビューに表示する
            steps = sensorEvent.values[0];
            mStepCounterText.setText(String.format(Locale.US, "%f", steps));
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {

        }
    };
}

TYPE_STEP_COUNTERに対応している実機で確認すれば、なかなかの精度で歩数を計測してくれるアプリができるんじゃないかと思います。

プロジェクト全体はGitHubに置いてあります。お気に入りに登録、フォロー、プルリクエストなど、よろしくお願いいたします。

okuzawats/android-pedometer-sample: TYPE_STEP_COUNTERを使ったアプリのサンプルです。

シェアしてもらえるとうれしいです。゚(´っωc`)゚。