androidの歩数センサーを利用したサンプル
今まで使用していたものは古かったので新しいスマホのバージョンが5.x
いろいろ便利なセンサーも出てなんか使えるかもしれないので実験
歩数センサーサンプル
画面のXML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textview" /> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textview2" android:layout_below="@+id/textview" android:layout_alignParentStart="true" android:layout_marginTop="47dp" /> </RelativeLayout>
Activiryのソース
package jp.mshige1979.app.samapleappsensor2; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import org.w3c.dom.Text; public class MainActivity extends Activity implements SensorEventListener{ private SensorManager manager; private Sensor delectorSensor; private Sensor stepCntSensor; private int stepcount = 0; private int stepcount2 = 0; private TextView textview; private TextView textview2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //センサーマネージャを取得 manager = (SensorManager) getSystemService(SENSOR_SERVICE); //センサマネージャから TYPE_STEP_DETECTOR についての情報を取得する delectorSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR); //センサマネージャから TYPE_STEP_COUNTER についての情報を取得する stepCntSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); textview = (TextView)findViewById(R.id.textview); textview2 = (TextView)findViewById(R.id.textview2); textview.setText("STEP_DETECTOR="); textview2.setText("STEP_COUNTER="); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // accuracy に変更があった時の処理 } @Override public void onSensorChanged(SensorEvent event) { Sensor sensor = event.sensor; float[] values = event.values; long timestamp = event.timestamp; //TYPE_STEP_COUNTER if(sensor.getType() == Sensor.TYPE_STEP_COUNTER){ // 今までの歩数 Log.d("type_step_counter", String.valueOf(values[0])); stepcount2++; textview2.setText("STEP_COUNTER=" + stepcount2 + "歩"); } if(sensor.getType() == Sensor.TYPE_STEP_DETECTOR){ // ステップを検知した場合にアクセス Log.d("type_detector_counter", String.valueOf(values[0])); stepcount++; textview.setText("STEP_DETECTOR=" + stepcount + "歩"); } } @Override protected void onResume() { super.onResume(); // リスナー設定 manager.registerListener (this, stepCntSensor, SensorManager.SENSOR_DELAY_NORMAL); manager.registerListener(this, delectorSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); // リスナー解除 manager.unregisterListener(this,stepCntSensor); manager.unregisterListener(this,delectorSensor); } }
センサー
TYPE_STEP_DETECTOR
1ステップを検知しているよう値は常に「1.0」
TYPE_STEP_COUNTER
システムが検知した全ての歩数を保持している「4563.0」みたいな値
結果
所感
バックグラウンドで動かした方がいい
あと、検知がいまいちのような気がする。まあ完璧な精度である必要はないから大丈夫とは思うけど1日に何歩歩いたかの目安などは図れるかも…