Android 如何在安卓系统中使用加速计进行上下震动?

Android 如何在安卓系统中使用加速计进行上下震动?,android,accelerometer,android-sensors,Android,Accelerometer,Android Sensors,我试过下面的方法,但效果并不理想。。若设备保持正常状态,那个么它也会触发震动事件 @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub long curTime = System.currentTimeMillis(); // only allow one update every 200Ms. if ((curTime - la

我试过下面的方法,但效果并不理想。。若设备保持正常状态,那个么它也会触发震动事件

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub

    long curTime = System.currentTimeMillis();
    // only allow one update every 200Ms.
    if ((curTime - lastUpdate) > 200) {

        lastUpdate = curTime;

        x = event.values[SensorManager.DATA_X];
        y = event.values[SensorManager.DATA_Y];
        z = event.values[SensorManager.DATA_Z];

        Vibrator vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

        if (Round(y, 4) > 22) {
            vibrate.vibrate(200);
            Log.d("sensor", "==== Up Detected===");

        } else if (Round(y, 4) < -20) {
            vibrate.vibrate(200);
            Log.d("sensor", "==== Down Detected=== ");

        }

        mLastX = x;
        mLastY = y;
        mLastZ = z;
    }

}

public static float Round(float Rval, int Rpl) {
    float p = (float) Math.pow(10, Rpl);

    Rval = Rval * p;
    float tmp = Math.round(Rval);
    return (float) tmp / p;
}
@覆盖
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
long curTime=System.currentTimeMillis();
//仅允许每200Ms更新一次。
如果((curTime-lastUpdate)>200){
lastUpdate=curTime;
x=事件值[SensorManager.DATA_x];
y=事件值[SensorManager.DATA_y];
z=事件值[SensorManager.DATA_z];
可控震源振动=(可控震源)getSystemService(Context.可控震源服务);
如果(圆形(y,4)>22){
振动。振动(200);
Log.d(“传感器”,“检测到向上==”;
}否则如果(圆形(y,4)<-20){
振动。振动(200);
Log.d(“传感器”,“检测到的故障==”);
}
mLastX=x;
mLastY=y;
mLastZ=z;
}
}
公共静态浮点循环(浮点RVL、整数Rpl){
浮点p=(浮点)数学功率(10,Rpl);
Rval=Rval*p;
浮点tmp=数学圆(Rval);
返回(浮动)tmp/p;
}
请帮忙

任何帮助都将不胜感激


谢谢

传感器值非常原始且嘈杂。您需要在它们上面添加一层数字信号处理,以获得良好的效果。仅使用原始值将导致结果中的大量抖动。您正在尝试使用时间延迟执行一些基本操作,但您需要执行更多过滤


同时,你也在对震动做出反应。这种振动会使加速计看到移动,从而导致更多的误报。

将低通滤波器作为y轴值

基本过滤器如文件中所述

public void onSensorChanged(SensorEvent event){
  // In this example, alpha is calculated as t / (t + dT),
 // where t is the low-pass filter's time-constant and
 // dT is the event delivery rate.

 final float alpha = 0.8;

 // Isolate the force of gravity with the low-pass filter.
 gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
 gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
 gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

 // Remove the gravity contribution with the high-pass filter.
 linear_acceleration[0] = event.values[0] - gravity[0];
 linear_acceleration[1] = event.values[1] - gravity[1];
 linear_acceleration[2] = event.values[2] - gravity[2];
  }

我没有得到你答案的第一部分。你从传感器得到的值不能被信任,因为它们有很多错误的读数,而且并不准确。在电气工程中有一门研究如何分析和调整信号读数的课程,叫做数字信号处理。其中的一个概念是过滤器——它是接受、拒绝或部分接受阅读的一种方式。你需要一个,我只是不知道该用哪个。