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

Java 如何使用加速计检测高于或等于2Gs的振动?,java,android,accelerometer,Java,Android,Accelerometer,我正在做一个android应用程序,它类似于一个汽车“黑匣子”,记录汽车的行驶过程 但我面临的问题是,如何集成一个能够在发生事故时检测运动(可能>=2Gs)的加速计,然后它应该触发视频录制停止并将其保存到存档文件中,从而不会因事故而丢失文件。。任何人都知道如何做上述任务,我需要紧急帮助这里请!我读过android开发者关于加速计的文章,但这对我的情况没有帮助。首先,我的物理成绩相当差;其次,我是android/java新手,我第一次尝试使用加速计?有简单的解决办法吗?提前感谢:) 这是视频录制部

我正在做一个android应用程序,它类似于一个汽车“黑匣子”,记录汽车的行驶过程

但我面临的问题是,如何集成一个能够在发生事故时检测运动(可能>=2Gs)的加速计,然后它应该触发视频录制停止并将其保存到存档文件中,从而不会因事故而丢失文件。。任何人都知道如何做上述任务,我需要紧急帮助这里请!我读过android开发者关于加速计的文章,但这对我的情况没有帮助。首先,我的物理成绩相当差;其次,我是android/java新手,我第一次尝试使用加速计?有简单的解决办法吗?提前感谢:)

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

将startRecording()方法放在下面的活动中,当加速度超过2G时会调用它,您可以通过更改CRASH\u G\u乘数的值来更改它

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);
    }
}
您应该注意以下几点:

  • 正如其他人所提到的,2的值需要大幅增加,但您可以通过实验对其进行微调

  • 您将需要获得唤醒锁。要创建唤醒锁,请执行以下操作:

    PowerManager pm=(PowerManager)getSystemService(Context.POWER\u服务); wl=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,“ATag”); wl.acquire()

  • 完成后,请执行以下操作:

    wl.release();
    
    (您可能希望将完全唤醒锁定更改为低优先级唤醒锁定)。(您还需要为唤醒锁向清单文件添加适当的权限)

  • 您可能希望提高采样率。不过,这会大大消耗电池电量。您可以为其指定不同的值,在上面的代码中,替换:

    SensorManager.SENSOR\u延迟\u正常

  • 使用以下任何一项:

    SensorManager.SENSOR_DELAY_UI
    SensorManager.SENSOR_DELAY_GAME
    SensorManager.SENSOR_DELAY_FASTEST
    
    有两点: Bosch BMA150用于许多智能手机,2g设置为最大加速度值(因此您可能永远看不到>2g)。 使用最快的传感器延迟,您可以在HTC上每隔20毫秒读取一次读数。但是,由于手机上有一个多任务操作系统,因此无法保证此时间(操作系统繁忙时可能会出现几秒钟的延迟)


    因此,智能手机目前并不真正适合此应用程序。如果Android允许在未来更智能地使用加速计,这种情况可能会改变。如果允许onSensorChanged设置一个阈值参数,则超过该阈值的加速度可以缓冲在加速计芯片的存储器中,并在适当时读取。

    2G,普通汽车中非常少量。当你打喷嚏时,你可以达到2.9G;-)@那么,您建议Gs值是多少?即使我知道这个值,我也不知道如何实现必要的代码?你能帮帮我吗?我是个机器人新手,急需帮助。。。被困在这一周左右没有真正的进展…我看到一整列的问题自动与你的帖子关联,出现在它的右边。你有没有试过读它们中的任何一个?我的物理成绩不好,所以你应该核实一下。但假设v为50 km/h,撞击时间约为80 ms,这约为173 m/s^2 so 17g。但这是理论,在实践中这是非常复杂的。这里有一个包含一些数据的表,可以使用double-accel=Math.sqrt(Math.pow(arg0.values[0],2)+Math.pow(arg0.values[1],2)+Math.pow(arg0.values[2],2));那么2的值是固定的?对不起,金娜的身体不好。。