检测Android中的Shake

时间:2016-07-28 10:36:59

标签: android android-sensors shake

当用户摇动设备10次时,我正试图点击API。我已经尝试了很多git简单和堆栈溢出解决方案,但没有它们可以解决我的问题。一些Git库正在工作但是在10次之前或10次之后检测到摇动。 i have tried this library
and this图书馆。请给我一些有价值的解决方案。

3 个答案:

答案 0 :(得分:1)

使用 SensorListener

请检查这个勾选的答案......

您必须调整 SHAKE_THRESHOLD 值才能实现此目标

How to detect shake event with android?

谢谢!

答案 1 :(得分:1)

我已经使用此库完成了此操作:

1)在您的build.gridle文件中添加Dependecy

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
}

dependencies {
   compile 'com.github.safetysystemtechnology:android-shake-detector:v1.2'
}

2)将权限授予您的应用清单文件

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />

如果您将在后台运行,请注册您的广播接收器

<receiver android:name=".ShakeReceiver">
    <intent-filter>
        <action android:name="shake.detector" />
    </intent-filter>
</receiver>

3)在onCreate方法中像这样开始:

private ShakeDetector shakeDetector;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buildView();

    ShakeOptions options = new ShakeOptions()
            .background(true)
            .interval(1000)
            .shakeCount(2)
            .sensibility(2.0f);

    this.shakeDetector = new ShakeDetector(options).start(this, new ShakeCallback() {
        @Override
        public void onShake() {
            Log.d("event", "onShake");
        }
    });

    //IF YOU WANT JUST IN BACKGROUND
    //this.shakeDetector = new ShakeDetector(options).start(this);
}

4)覆盖onStop方法并停止

@Override
protected void onStop() {
    super.onStop();
shakeDetector.stopShakeDetector(getBaseContext());
}

5)覆盖onDistroy方法和这样的发行版:

@Override
protected void onDestroy() {
    shakeDetector.destroy(getBaseContext());
    super.onDestroy();
}

(*)可选步骤:如果要在后台运行,请创建广播接收器

public class ShakeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (null != intent && intent.getAction().equals("shake.detector")) {
            ...
        }
    }
}

答案 2 :(得分:0)

有一个静态变量,每次检测到抖动时都会增加。

static int count = 0;
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    long curTime = System.currentTimeMillis();
    if ((curTime - mLastShakeTime) > MIN_TIME_BETWEEN_SHAKES_MILLISECS) {

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        double acceleration = Math.sqrt(Math.pow(x, 2) +
                Math.pow(y, 2) +
                Math.pow(z, 2)) - SensorManager.GRAVITY_EARTH;

        if (acceleration > SHAKE_THRESHOLD) {
            mLastShakeTime = curTime;
            count++;
            if(count==10){
                //your code goes here
            }
        }
    }
}