安卓:抖动检测器过于敏感 [英] Android: Shake Detector too Sensitive

查看:192
本文介绍了安卓:抖动检测器过于敏感的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图来检测抖动 - 我用下面的code, 它的工作原理非常好,但在某些设备(GALAXY NOTE 2为例)检测到的抖动太快(在某些情况下 - 当我只是拿着手机仍然)

main.java:

  ShakeListener mShaker =新ShakeListener(本);
     mShaker.setOnShakeListener(新ShakeListener.OnShakeListener(){
         公共无效onShake()
         {
        //有些code ...
         }
     });
}
 

ShakeListener.java:

 包com.my.app;

进口android.hardware.Sensor;
进口android.hardware.SensorEvent;
进口android.hardware.SensorEventListener;
进口android.hardware.SensorManager;
进口android.widget.Toast;
进口android.content.Context;
进口java.lang.UnsupportedOperationException;

公共类ShakeListener实现SensorEventListener
{
      私有静态最终诠释FORCE_THRESHOLD = 700;
      私有静态最终诠释TIME_THRESHOLD = 100;
      私有静态最终诠释SHAKE_TIMEOUT = 500;
      私有静态最终诠释SHAKE_DURATION = 1000;
      私有静态最终诠释SHAKE_COUNT = 5;

      私人的SensorManager mSensorMgr;
      私人浮动mLastX = -1.0F,mLastY = -1.0F,mLastZ = -1.0F;
      专用长mLastTime;
      私人OnShakeListener mShakeListener;
      私人语境mContext;
      私人诠释mShakeCount = 0;
      专用长mLastShake;
      专用长mLastForce;

      公共接口OnShakeListener
      {
        公共无效onShake();
      }

      公共ShakeListener(上下文的背景下)
      {
        mContext =背景;
        恢复();
      }

      公共无效setOnShakeListener(OnShakeListener监听器)
      {
        mShakeListener =侦听器;
      }

      公共无效简历(){
        mSensorMgr =(的SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
        如果(mSensorMgr == NULL){
          抛出新UnsupportedOperationException异常(传感器不支持);
        }
        布尔支持= FALSE;
        尝试 {
        支持= mSensorMgr.registerListener(这一点,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME);
        }赶上(例外五){Toast.makeText(mContext,抖不支持,Toast.LENGTH_LONG).show();}

        如果((支持)及!及(mSensorMgr = NULL)!)mSensorMgr.unregisterListener(本);
      }

      公共无效暂停(){
        如果(mSensorMgr!= NULL){
          mSensorMgr.unregisterListener(本);
          mSensorMgr = NULL;
        }
      }

      公共无效onAccuracyChanged(传感器传感器,诠释精度){}

      公共无效onSensorChanged(SensorEvent事件)
      {
        如果(event.sensor.getType()!= Sensor.TYPE_ACCELEROMETER)
              返回;
        长今= System.currentTimeMillis的();

        如果((现 -  mLastForce)> SHAKE_TIMEOUT){
          mShakeCount = 0;
        }

        如果((现 -  mLastTime)> TIME_THRESHOLD){
          长差异=现在 -  mLastTime;
          浮速度= Math.abs(event.values​​ [0] + event.values​​ [1] + event.values​​ [2]  -  mLastX  -  mLastY  -  mLastZ)/差异* 10000;
          如果(速度> FORCE_THRESHOLD){
            如果((++ mShakeCount> = SHAKE_COUNT)及及(现在 -  mLastShake> SHAKE_DURATION)){
              mLastShake =现在;
              mShakeCount = 0;
              如果(mShakeListener!= NULL){
                mShakeListener.onShake();
              }
            }
            mLastForce =现在;
          }
          mLastTime =现在;
          mLastX = event.values​​ [0];
          mLastY = event.values​​ [1];
          mLastZ = event.values​​ [2];
        }
      }
}
 

解决方案

检查加速具有更高一些抖动。看看这个code它为我工作。

 私人最终SensorEventListener mSensorListener =新SensorEventListener(){

        公共无效onSensorChanged(SensorEvent SE){
            浮X = se.values​​ [0];
            浮Y = se.values​​ [1];
            浮Z = se.values​​ [2];
            mAccelLast = mAccelCurrent;
            mAccelCurrent =(浮动)的Math.sqrt((双)(X * X + Y * Y + Z * Z));
            浮动三角洲= mAccelCurrent  -  mAccelLast;
            mAccel = mAccel * 0.9F +增量; //执行低切滤波器

            如果(mAccel→8){
                 Toast.makeText(getApplicationContext(),
             你已经动摇了你的电话,Toast.LENGTH_SHORT).show();
            }

        }

        公共无效onAccuracyChanged(传感器传感器,诠释精度){
            Log.i(传感器,mAccel+ mAccel);
        }
    };
 

I'm trying to detect a shake - and i'm using the following code, it works very good, but in some devices (Galaxy note 2 for example) it detects the shake too soon (in some cases - when i just hold the phone still)

main.java:

ShakeListener mShaker = new ShakeListener(this);
     mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {
         public void onShake()
         {
        // Some 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;
        try {
        supported = mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
        } catch (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 now = System.currentTimeMillis();

        if ((now - mLastForce) > SHAKE_TIMEOUT) {
          mShakeCount = 0;
        }

        if ((now - mLastTime) > TIME_THRESHOLD) {
          long diff = now - 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 with higher number of shake. Take a Look on this code it works for 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 your phone", Toast.LENGTH_SHORT).show();
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            Log.i("Sensor", "mAccel" + mAccel);
        }
    };

这篇关于安卓:抖动检测器过于敏感的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆