SensorEventListener 接口 撼一摇
SensorEventListener 接口 摇一摇
public class test extends Activity implements OnClickListener, SensorEventListener { private SensorManager mSensorManager; @Override protected void onCreate(Bundle savedInstanceState) { //.............. } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } private float[] temp; @Override public void onSensorChanged(SensorEvent event) { if(PublicUtil.isWallPaperLocked(this))return; //屏幕如果锁定 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { if (temp!=null&&isShake(event.values)) { if (!isShaking) { isShaking = true; Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { // TODO Auto-generated method stub getData(); } }; timer.schedule(task, 1000);//延迟一秒执行 } } temp = event.values.clone();//克隆传感器里的values的值 } } boolean isShake(float[] values){ boolean flag = false; for (int i = 0; i < values.length; i++) { if(temp[i]-values[i]>15){ //如果摇动的力度大于15 就执行摇一摇 System.out.println("temp="+temp[i]+"value="+values[i]); flag = true; break; } } return flag; } @Override protected void onResume() { super.onResume(); StatService.onResume(this); // 加速度传感器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), // 还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, // 根据不同应用,需要的反应速率不同,具体根据实际情况设定 SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); StatService.onPause(this); mSensorManager.unregisterListener(this); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); // this.unRegisterLocationListener(); mSensorManager.unregisterListener(this); }
从这个示例,我们可以基本总结出使用Android传感器的步骤,注册一个SensorEventListener,然后在onSensorChanged方法中处理传感器的数据。
这里需要注意的一点是,我把注册Sensor这个过程放在了onResume()方法中,而取消注册放在了onPause()方法中,这主要是因为,传感器的使用太耗电了,而且一定需要手动取消注册,否则即使Activity不可见,传感器依然在工作中,几个小时内就会耗光电量。
更多传感器的知识参考
http://aliusa.iteye.com/blog/1064560