如何使用加速度计检测高于或等于2Gs的振动?

时间:2011-05-23 16:19:31

标签: java android accelerometer

我正在做Android应用程序,就像汽车“黑盒子”一样记录了汽车的行驶过程。

但我面临着如何整合加速度计的问题,该加速度计能够在发生事故时检测到移动(可能> = 2Gs),然后它应该触发视频录制以停止并将其保存到存档文件,因此不会因事故而丢失文件。任何人都知道如何进行上述任务,我宁愿在这里急需帮助!我已经阅读了关于加速度计的android开发人员并且它在我的情况下没有帮助首先我在物理学上相当糟糕第二我是android / java的新手并且我第一次尝试使用加速度计?有什么简单的解决在此先感谢:)

这是视频录制部分的一部分,但现在我如何将加速计纳入“自动存档”目的?

2 个答案:

答案 0 :(得分:1)

有几点: 博世BMA150用于许多智能手机,其中2g设置为最大加速度值(因此您可能永远不会看到> 2g)。 使用SENSOR_DELAY_FASTEST,您可以在HTC Desire上每20毫秒读取一次读数。但是,由于手机上有多任务操作系统,因此无法保证此时间(操作系统繁忙时可能会延迟几秒钟)。

因此智能手机目前不适合这种应用。如果Android允许在未来更智能地使用加速度计,这可能会改变。如果允许onSensorChanged为阈值参数,那么超过此阈值的加速度可以缓冲在加速度计芯片的存储器中并在适当时读出。

答案 1 :(得分:0)

将startRecording()方法放在下面的Activity中,当加速度超过2G时调用它,你可以通过改变CRASH_G_MULTIPLIER的值来改变它

public class YourActivity extends Activity {
    private double G = 9.81;
    private double CRASH_G_MULTIPLIER = 2;
    @Override public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startDropListening();
    }
    private void startRecording(){
        // your code that does the recording here
    }
    private void startDropListening(){
        SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
        sm.registerListener(
            new SensorEventListener(){
                @Override public void onAccuracyChanged(Sensor arg0, int arg1) {}
                @Override public void onSensorChanged(SensorEvent arg0) {
                    double accel = Math.sqrt(
                            Math.pow(arg0.values[0], 2) +   
                            Math.pow(arg0.values[1], 2) + 
                            Math.pow(arg0.values[2], 2));
                    if (accel > G * CRASH_G_MULTIPLIER){
                        startRecording();
                    }
                }
            }, 
            sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
            SensorManager.SENSOR_DELAY_NORMAL);
    }
}

你应该注意一些事情:

  1. 正如其他人所说,2的价值需要大幅增加,但你可以通过实验自行调整。

  2. 您需要获取唤醒锁定。要创建唤醒锁定,请执行以下操作:

    PowerManager pm =(PowerManager)getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,“ATag”); wl.acquire();

  3. 以下结束时:

    wl.release();
    

    (您可能希望将FULL_WAKE_LOCK更改为较低优先级的唤醒锁定)。 (您还需要为清单锁定添加相应的权限以获取唤醒锁定)

    1. 您可能希望提高采样率。但这会显着耗尽电池。您可以为其分配不同的值,在上面的代码中,替换:

      SensorManager.SENSOR_DELAY_NORMAL

    2. 以下任何一项:

      SensorManager.SENSOR_DELAY_UI
      SensorManager.SENSOR_DELAY_GAME
      SensorManager.SENSOR_DELAY_FASTEST