Обнаружение взмаха руки сенсором Android

Я пытаюсь реализовать датчик, который может обнаруживать взмах руки. Я нашел пример, который может делать наведение руки, но не махать рукой.

Следующий код, который я использовал, взят из Как управлять датчиком приближения Android?

public class AndroidProximitySensorActivity extends Activity {

 TextView ProximitySensor, ProximityMax, ProximityReading;

 SensorManager mySensorManager;
 Sensor myProximitySensor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ProximitySensor = (TextView)findViewById(R.id.proximitySensor);
    ProximityMax = (TextView)findViewById(R.id.proximityMax);
    ProximityReading = (TextView)findViewById(R.id.proximityReading);

    mySensorManager = (SensorManager)getSystemService(
      Context.SENSOR_SERVICE);
    myProximitySensor = mySensorManager.getDefaultSensor(
      Sensor.TYPE_PROXIMITY);

    if (myProximitySensor == null){
     ProximitySensor.setText("No Proximity Sensor!"); 
    }else{
     ProximitySensor.setText(myProximitySensor.getName());
     ProximityMax.setText("Maximum Range: "
       + String.valueOf(myProximitySensor.getMaximumRange()));
     mySensorManager.registerListener(proximitySensorEventListener,
       myProximitySensor,
       SensorManager.SENSOR_DELAY_NORMAL);
    }
}

SensorEventListener proximitySensorEventListener
= new SensorEventListener(){

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
 // TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub

if(event.sensor.getType()==Sensor.TYPE_PROXIMITY){
 ProximityReading.setText("Proximity Sensor Reading:"
   + String.valueOf(event.values[0]));
 }
 }
  };
 }

В приведенном выше коде, когда event.values[0] = 0, это означает, что моя рука находится на датчике. Тем не менее, мне нужен мой датчик для обнаружения взмаха руки. Как это сделать? Спасибо.


person Julia    schedule 11.08.2016    source источник


Ответы (1)


Пожалуйста, попробуйте этот код:

    private SensorManager sensorManager;
    private Sensor proximitySensor;

    private final int WAVE_TIME = 2000;
    private final int WAVE_NEEDED_MOVEMENTS = 3;
    private long lastWaveTime = 0;
    private float lastSensorValue;
    private float maxSensorValue;
    private float numOfMovements = 0; 


        public void onCreate() {
              super.onCreate();

              sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
              proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
              sensorManager.registerListener(proximitySensorEventListener, proximitySensor,SensorManager.SENSOR_DELAY_NORMAL);
              maxSensorValue = proximitySensor.getMaximumRange();
        }

        @Override
        public void onSensorChanged(SensorEvent event) {

             if(lastWaveTime + WAVE_TIME > System.currentTimeMillis()) {
                 System.out.println("Reset timing...");
                 lastWaveTime = System.currentTimeMillis();
                 numOfMovements = 0;
                 lastSensorValue = event.values[0];
             } else if((event.values[0] != maxSensorValue && lastSensorValue == maxSensorValue) || (event.values[0] == maxSensorValue && lastSensorValue != maxSensorValue) ){
                 numOfMovements++;
                 if(numOfMovements == WAVE_NEEDED_MOVEMENTS) {
                     System.out.println("WAVE EVENT");
                     lastWaveTime = System.currentTimeMillis();
                     numOfMovements = 0;
                 }
             }

        }
person FayaX    schedule 06.10.2016
comment
на самом деле это не работает ... вы забыли объявить близостьSensorEventListener. Во всяком случае, я проверил, и это не очень надежно, есть другие идеи? Меня также интересует детектор ручных волн - person moyo; 06.11.2017