Thursday, 15 January 2015

Android: Shake Detector too Sensitive -



Android: Shake Detector too Sensitive -

i'm trying observe shake - , i'm using next code, works good, in devices (galaxy note 2 example) detects shake (in cases - when hold phone still)

main.java:

shakelistener mshaker = new shakelistener(this); mshaker.setonshakelistener(new shakelistener.onshakelistener () { public void onshake() { // code... } }); }

shakelistener.java :

package com.my.app; import android.hardware.sensor; import android.hardware.sensorevent; import android.hardware.sensoreventlistener; import android.hardware.sensormanager; import android.widget.toast; import android.content.context; import java.lang.unsupportedoperationexception; public class shakelistener implements sensoreventlistener { private static final int force_threshold = 700; private static final int time_threshold = 100; private static final int shake_timeout = 500; private static final int shake_duration = 1000; private static final int shake_count = 5; private sensormanager msensormgr; private float mlastx=-1.0f, mlasty=-1.0f, mlastz=-1.0f; private long mlasttime; private onshakelistener mshakelistener; private context mcontext; private int mshakecount = 0; private long mlastshake; private long mlastforce; public interface onshakelistener { public void onshake(); } public shakelistener(context context) { mcontext = context; resume(); } public void setonshakelistener(onshakelistener listener) { mshakelistener = listener; } public void resume() { msensormgr = (sensormanager)mcontext.getsystemservice(context.sensor_service); if (msensormgr == null) { throw new unsupportedoperationexception("sensors not supported"); } boolean supported = false; seek { supported = msensormgr.registerlistener(this, msensormgr.getdefaultsensor(sensor.type_accelerometer), sensormanager.sensor_delay_game); } grab (exception e) {toast.maketext(mcontext, "shaking not supported", toast.length_long).show();} if ((!supported)&&(msensormgr != null)) msensormgr.unregisterlistener(this); } public void pause() { if (msensormgr != null) { msensormgr.unregisterlistener(this); msensormgr = null; } } public void onaccuracychanged(sensor sensor, int accuracy) { } public void onsensorchanged(sensorevent event) { if (event.sensor.gettype() != sensor.type_accelerometer) return; long = system.currenttimemillis(); if ((now - mlastforce) > shake_timeout) { mshakecount = 0; } if ((now - mlasttime) > time_threshold) { long diff = - mlasttime; float speed = math.abs(event.values[0] + event.values[1] + event.values[2] - mlastx - mlasty - mlastz) / diff * 10000; if (speed > force_threshold) { if ((++mshakecount >= shake_count) && (now - mlastshake > shake_duration)) { mlastshake = now; mshakecount = 0; if (mshakelistener != null) { mshakelistener.onshake(); } } mlastforce = now; } mlasttime = now; mlastx = event.values[0]; mlasty = event.values[1]; mlastz = event.values[2]; } } }

check acceleration higher number of shake. take on code works me.

private final sensoreventlistener msensorlistener = new sensoreventlistener() { public void onsensorchanged(sensorevent se) { float x = se.values[0]; float y = se.values[1]; float z = se.values[2]; maccellast = maccelcurrent; maccelcurrent = (float) math.sqrt((double) (x * x + y * y + z * z)); float delta = maccelcurrent - maccellast; maccel = maccel * 0.9f + delta; // perform low-cut filter if (maccel > 8) { toast.maketext(getapplicationcontext(), "you have shaken phone", toast.length_short).show(); } } public void onaccuracychanged(sensor sensor, int accuracy) { log.i("sensor", "maccel" + maccel); } };

android android-sensors

No comments:

Post a Comment