detect Shake in android

后端 未结 3 1679
孤城傲影
孤城傲影 2021-01-14 08:43

I am trying to hit an API when user shake a device 10 times. I have tried many git sample and stack overflow solution but non of them did solve my problem. Some of them dete

相关标签:
3条回答
  • 2021-01-14 09:06

    I have done that using this library :

    1) Add the dependecy in your build.gridle file

    allprojects {
      repositories {
        ...
        maven { url 'https://jitpack.io' }
      }
    }
    
    dependencies {
       compile 'com.github.safetysystemtechnology:android-shake-detector:v1.2'
    }
    

    2) Give the permission to your app manifest file

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

    if you will run in background, register your broadcast receiver

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

    3) start that in onCreate method Like this :

    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) override onStop method and stop that

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

    5) override onDistroy method and distroy like this :

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

    (*) Optional step : if you will run in background, create your broadcast receiver

    public class ShakeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (null != intent && intent.getAction().equals("shake.detector")) {
                ...
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-14 09:12

    have a static variable that gets incremented every time a shake is detected.

    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
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-14 09:26

    By Using SensorListener

    Please check this ticked answer...

    You have to adjust SHAKE_THRESHOLD value to achieve this

    How to detect shake event with android?

    Thank you!

    0 讨论(0)
提交回复
热议问题