0

ShakeListener を実装しようとしています。そこで、 ShakeListener.java というクラスを作成しました。

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;

        }
    }

}

ここで、メイン アクティビティから呼び出したいと思います (シェイク ブール値が変化するのを待つ While ループを実装することを考えていますか?)。したがって、私の主な活動では、次を使用します。

    private ShakeListener myShakeListener;

その後

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

しかし、回線に NPE が表示されます。

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

私は何を間違っていますか?これをどのように実装すればよいですか?

4

1 に答える 1

0

を見てくださいsensorService。違います。コードを変更してください:

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);
于 2012-07-18T12:04:24.453 に答える