白日依山尽吧 关注:8贴子:271
  • 1回复贴,共1

Android传感器的运用之ACCELEROMETER

只看楼主收藏回复

Android中支持很多种传感器:
比如加速度,重力的,光感,磁感等等。
在运用该API常用到的两个类和一个接口
SensorManager:传感器管理类;
Sensor:一个描述传感器的类;
SensorEventListener:传感器事件监听类(SensorListener类已过期);
一般运用步骤:
1.通过上下文获取SensorManager的对象。
[java] view plaincopy
Context.getSystemService(Context.Sensor_service);
2.实例化一个你需要使用的sensor对象。
[java] view plaincopy
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
也可以通过getSensorList()来获取所有的传感器对象,返回一个list;
3.实现传感器监听接口
4.注册传感器
5.反注册传感器
代码例子都很简单简短。
以下附上我以前用到的一个关于加速度的传感器,我用来做摇晃事件监听;


IP属地:广东1楼2013-09-01 14:06回复
    [java] view plaincopy
    /**
    * 摇动检测器
    * @author Nono
    *
    */
    public class ShakeDetector implements SensorEventListener{
    private static final String TAG = ShakeDetector.class.getSimpleName();
    private static final double SHAKE_SHRESHOLD = 7000d;
    private Context mContext;
    private long lastTime ;
    private float last_x;
    private float last_y;
    private float last_z;
    private SensorManager sensorManager;
    private onShakeListener shakeListener;
    /**
    * 构造
    * @param context
    */
    public ShakeDetector(Context context){
    mContext = context;
    sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    }
    /**
    * 注册传感器
    */
    public boolean registerListener() {
    if (sensorManager != null) {
    Sensor sensor = sensorManager
    .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    if (sensor != null) {
    this.sensorManager.registerListener(this, sensor,
    SensorManager.SENSOR_DELAY_GAME);
    LogUtil.log(TAG, "registerListener: succeed!!");
    return true;
    }
    }
    return false;
    }
    /**
    * 反注册传感器
    */
    public void unRegisterListener() {
    if (sensorManager != null)
    sensorManager.unregisterListener(this);
    }
    public void setOnShakeListener(onShakeListener listener){
    shakeListener = listener;
    }
    public void onSensorChanged(SensorEvent event) {
    //if (event.sensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {
    long curTime = java.lang.System.currentTimeMillis();
    if ((curTime - lastTime) > 10) {
    long diffTime = (curTime - lastTime);
    lastTime = curTime;
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
    float speed = Math.abs(x + y + z - last_x - last_y - last_z)
    / diffTime * 10000;
    if (speed > SHAKE_SHRESHOLD) {
    // 检测到摇晃后执行的代码
    shakeListener.onShake();
    }
    last_x = x;
    last_y = y;
    last_z = z;
    }
    //}
    }
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub
    }
    /**
    *
    * @author Nono
    *
    */
    public interface onShakeListener{
    public void onShake();
    }
    }
    上面是自己实现的一个关于加速度的传感器类
    在Activity中实例化该类,并实现onShakeListener接口
    [java] view plaincopy
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    super.onCreate(savedInstanceState);
    mContext = this;
    mShakeDetector = new ShakeDetector(mContext);
    mShakeDetector.setOnShakeListener(this);
    然后你可以在Activity的几个生命周期中实现它的注册和反注册。
    在onshakeListener中onShake方法中做传感器检测到变动的事件处理。


    IP属地:广东2楼2013-09-01 14:06
    回复