2012-07-18 2 views
0

ShakeListener를 구현하려고합니다.별도의 클래스에있는 ShakeListener 구현

import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.util.Log; 

public class ShakeListener implements SensorEventListener { 

    private SensorManager sensorManager; 
    private List<Sensor> sensors; 
    private Sensor sensor; 
    private long lastUpdate = -1; 
    private long currentTime = -1; 

    private float last_x, last_y, last_z; 
    private float current_x, current_y, current_z, currenForce; 
    private static final int FORCE_THRESHOLD = 900; 
    private final int DATA_X = SensorManager.DATA_X; 
    private final int DATA_Y = SensorManager.DATA_Y; 
    private final int DATA_Z = SensorManager.DATA_Z; 

    public ShakeListener(Activity parent) { 
     SensorManager sensorService = (SensorManager) parent 
       .getSystemService(Context.SENSOR_SERVICE); 
     this.sensorManager = sensorManager; 

     this.sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); 
     if (sensors.size() > 0) { 
      sensor = sensors.get(0); 
     } 
    } 

    public void start() { 
     if (sensor != null) { 
      sensorManager.registerListener(this, sensor, 
        SensorManager.SENSOR_DELAY_GAME); 
     } 
    } 

    public void stop() { 
     sensorManager.unregisterListener(this); 
    } 

    public void onAccuracyChanged(Sensor s, int valu) { 

    } 

    public void onSensorChanged(SensorEvent event) { 

     if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER 
       || event.values.length < 3) 
      return; 

     currentTime = System.currentTimeMillis(); 

     if ((currentTime - lastUpdate) > 100) { 
      long diffTime = (currentTime - lastUpdate); 
      lastUpdate = currentTime; 

      current_x = event.values[DATA_X]; 
      current_y = event.values[DATA_Y]; 
      current_z = event.values[DATA_Z]; 

      currenForce = Math.abs(current_x + current_y + current_z - last_x 
        - last_y - last_z) 
        /diffTime * 10000; 

      if (currenForce > FORCE_THRESHOLD) { 

       Log.d("ShakeListener", "SHAKE DETECTED"); 

      } 
      last_x = current_x; 
      last_y = current_y; 
      last_z = current_z; 

     } 
    } 

} 

지금, 내 주요 활동에서 그것을 envoke 할 (악수 부울 변경을 기다리는 동안 루프를 구현하는 방법에 대한 생각?) : 그래서 ShakeListener.java라는 클래스를 만들었다.

private ShakeListener myShakeListener; 

다음

myShakeListener = new ShakeListener(this); 
    myShakeListener.start(); 

하지만 난 회선에 자동 NPE를 얻을 : 그래서 내 주요 활동으로, 내가 사용하는 내가 잘못을

 this.sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); 

을 뭐하는 거지? 어떻게 구현해야합니까? sensorService에서

답변

0

봐. 그건 잘못 됐어. 코드를 변경합니다

SensorManager sensorService = (SensorManager) parent 
       .getSystemService(Context.SENSOR_SERVICE); 
     this.sensorManager = sensorManager; 

SensorManager sensorService = (SensorManager) parent 
       .getSystemService(Context.SENSOR_SERVICE); 
     this.sensorManager = sensorService ; 

에 또는 더 나은 코드 :

this.sensorManager = (SensorManager) parent.getSystemService(Context.SENSOR_SERVICE); 
+0

감사합니다! 나는 이것을 간과했다 : (.. 그것은 지금 일한다! –