我有一个从Activity调用的服务。本服务注册所有传感器和注册监听器。
编辑:我已删除onSensorChange()中的两行
**sensorManager.unregisterListener(this);
sensorManager = null;**
现在可行了。 WHY吗
问题是,当我一次一个地执行它们时,我的应用程序工作正常,但如果我注册了多个传感器,我的应用程序崩溃。
以下是我服务的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 Function:
中启动这样的服务intent = new Intent(this, CustomSensorService.class);
startService(intent);
答案 0 :(得分: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) {
}
};