0

アクティビティから呼び出されるサービスがあります。このサービスは、すべてのセンサーを登録し、それらに対してリスナーを登録します。

編集: onSensorChange() の 2 行を削除しました

**sensorManager.unregisterListener(this);
        sensorManager = null;**

そして今それは動作します。なぜ?

問題は、一度に 1 つずつ実行するとアプリケーションは正常に動作しますが、複数のセンサーを登録するとアプリケーションがクラッシュすることです。

これが私のサービスの OnCreate 関数です。

@Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        Toast.makeText(getApplicationContext(),"Service Created",Toast.LENGTH_SHORT).show();
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        //mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mMagnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        //mGyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        //      mLinearAccelertion = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

        //sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
        //sensorManager.registerListener(this, mGyro, SensorManager.SENSOR_DELAY_NORMAL);
        //sensorManager.registerListener(this, mLinearAccelertion, SensorManager.SENSOR_DELAY_NORMAL);


    }

ここに私の onSensorChanged 関数があります:

    @Override
    public void onSensorChanged(SensorEvent event) {
        //Toast.makeText(mContext,"Heelooo" , Toast.LENGTH_SHORT).show();
        float[] values = event.values;
        Sensor mSensor = event.sensor;
        boolean res = CalculatePosition.calculateNewPosition(4.5F,5.3F);
        if(res){
            Toast.makeText(mContext, "Check", Toast.LENGTH_SHORT).show();
        }
        //CalculatePosition.test(event);
        sensorManager.unregisterListener(this);
        sensorManager = null;
}

MyActivity onCreate 関数で次のようなサービスを開始しています。

intent = new Intent(this, CustomSensorService.class);
        startService(intent);

丸太猫

4

1 に答える 1

1

OnSensorChanged イベントは、sensorManager を Null に設定しているため、センサーが起動されるとすぐに設定できなくなります。

編集

各センサーで異なるリスナーを使用する場合は、アクティビティにメソッドを実装する代わりに、次のようなものを使用します。

private void SetupSensors() {
    sensorManager.registerListener(MagneticListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
}

private SensorEventListener MagneticListener = new SensorEventListener() {

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        // Code here
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }
};
于 2013-10-13T14:27:26.230 に答える