最近看了一篇文章,有关程序员身体健康的,然后自己就下载了两个有关运动的应用监督一下自己;这些应用有许多的产品共性,比如社交。除此而外了,就是记步这个小功能,除了它们,包括支付宝,微信等都有相关小功能,于是就简单看了相关的API使用。
在说之前,我先说一下本篇主要针对Android4.4及以上且有记步传感器的机型。其实,关于几步这一块,Android应用层接口提供的就是读取传感器数据的接口。计步的实现和数据都是保存在SensorEvent中的。下面就来看看使用步骤,这里我们主要参照官方API使用方式,有兴趣看一下官方Android传感器使用介绍。
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
List list=manager.getSensorList(Sensor.TYPE_ALL);
for(Sensor sensor:list){
Log.e(TAG, "initData: "+sensor.getName() );
}
如果日志有下面传感器日志,表示支持:
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
stepSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
manager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL);
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
//event.values[0]为计步历史累加值
Log.e(TAG, "onSensorChanged: 当前步数:" + event.values[0]);
if(sensorTotalStep==0){
sensorTotalStep= (long) event.values[0];
todayStep=0;
}
else {
todayStep= (long) (event.values[0]-sensorTotalStep);
}
}
}
上面就是针对计步传感器数据实时获取的一种实现,其他传感器也是类似的;我这里完全是参照官网调用方式实现的;线面就来看看官网调用的一个加速度传感器和我调用的计步传感器的实现,你会发现除了接口名称不一样,其他都是一样的。
public class SensorActivity extends Activity implements SensorEventListener {
private final SensorManager mSensorManager;
private final Sensor mAccelerometer;
public SensorActivity() {
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
}
}
public class MainActivity extends AppCompatActivity implements SensorEventListener{
SensorManager manager;
Sensor stepSensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
stepSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
Log.e(TAG, "onSensorChanged: 当前步数:" + event.values[0]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
manager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
我们从event.value[0]可以取出从开机到现在计步传感器累计记录的步数,这个数据在设备关机后置0,所以我们可以根据数据以及这些特性做一些处理,时间一个基本的计步功能。结合几个需要特别注意的点,我画了一个图,实现图中的描述基本上就可以完成一个计步功能。
下面结合上图简单的说明一下,我们主要看功能的组成部分和几种特殊的情况。
(1)关机:上面也说了,关机的时候,计步传感器中的数据会清除,所以,我们需要自己维护和保存关键前的数据,主要包括传感器中的总步数和今天已经行走的步数
(2)开机:开机维护数据服务启动,恢复保存的数据,监听计步传感器实时更新数据
(3)跨天:现在的应用基本上都有今天的步数,所以就有一个跨天的数据统计。所以我们需要在服务中单独开一个线程做跨天检验或者更简单的一种做法是在读取传感器数据时做跨天校验;但是这两种做法开销都有点大;我们可以通过每天第一次读取计步传感器数据的时候计算出今天结束还需要多久,然后创建一个延迟任务来更新数据。到这里,关于计步的简单实现就介绍完了。
附:SensorEvent介绍:
This class represents a Sensor
event and holds information such as the sensor's type, the time-stamp, accuracy and of course the sensor's data
.
注:欢迎扫码关注