androidとiOSの歩数計(ステップカウンタ)実装方法の違い
歩数計は2017年現在、ほとんどのスマホに実装されている。
実装される前は、加速度センサーを歩数計の代わりに用いていたために、電池の消耗が激しく使い物にはならなかった。
2013年に発売されたスマホ機種から実装が始まっている。
iPhoneでは歩数をOSレベルで日次で集計しデータベース化してくれるが、androidは歩数を検知するのみで集計まではしてくれないため、日毎の集計はアプリが行う必要がある。
iOS
・歩数計ハードウェア実装はiPhone5S以降の機種のみ
・日付を指定して取得できる
objectivec
CMPedometer *mPedometer = [[CMPedometer alloc] init];
if ([CMPedometer isStepCountingAvailable]) {
[mPedometer queryPedometerDataFromDate:fetchStartDate toDate:fetchEndDate withHandler:^(CMPedometerData *data, NSError *error) {
// 歩数
NSNumber *steps = data.numberOfSteps;
}];
}
android
・Fujitsu ARROWSなどの低価格機種には歩数計が実装されていない
・SensorEventListener をサービスとして別プロセスで実行させる必要がある
・歩数は累積値だけしかわからないので、日毎の歩数はアプリが計算して求める必要がある
・日付指定の歩数を取得できない
Intent serviceIntent = new Intent(context, StepCounterService.class);context.startService(serviceIntent);public class StepCounterService extends Service implements SensorEventListener {@Override
public void onCreate() { // API19(Android 4.4)以上 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { // 歩数を取得 SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
Sensor mSensorStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); // リスナー設定 mSensorManager.registerListener (this, mSensorStepCounter, SensorManager.SENSOR_DELAY_NORMAL); }}// 歩数を検知したときコールされるメソッド@Overridepublic void onSensorChanged(SensorEvent sensorEvent) { float[] values = sensorEvent.values; // Sensorを最初に起動してからの累積値 long mTimestamp = sensorEvent.timestamp; // Sensorを最初に起動してからの経過ナノ秒値 int mStepCount = (int)values[0]; // Sensorを最初に起動してからの累積歩数
}}