Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在Android服务中注册多个传感器_Android_Android Service_Android Sensors - Fatal编程技术网

Can';t在Android服务中注册多个传感器

Can';t在Android服务中注册多个传感器,android,android-service,android-sensors,Android,Android Service,Android Sensors,我有一个从活动中调用的服务。此服务注册所有传感器并针对它们注册侦听器 编辑:我已删除onSensorChange()中的两行。 现在它可以工作了。为什么? 问题是,当我一次只注册一个传感器时,我的应用程序工作正常,但如果我注册了多个传感器,我的应用程序就会崩溃 以下是我的服务的OnCreate功能: @Override public void onCreate() { super.onCreate(); mContext = getApplicationC

我有一个从活动中调用的服务。此服务注册所有传感器并针对它们注册侦听器

编辑:我已删除onSensorChange()中的两行。

现在它可以工作了。为什么?

问题是,当我一次只注册一个传感器时,我的应用程序工作正常,但如果我注册了多个传感器,我的应用程序就会崩溃

以下是我的服务的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;
}
intent = new Intent(this, CustomSensorService.class);
        startService(intent);
我在MyActivity onCreate函数中启动如下服务:

    @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;
}
intent = new Intent(this, CustomSensorService.class);
        startService(intent);

您的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) {

    }
};

那么,我如何停止SensorListener?您可以按照之前的方式停止它,但在将sensorManager设置为null后,您无法注册另一个侦听器。不要取消sensorManager或分配manager.sensorManager.unregisterListener的另一个实例(此);这一行将注销所有传感器监听器?基本上,只要设置监听器,它就会启动并运行监听器代码,使其无效。然后,代码返回并尝试设置另一个侦听器,但sensorManager现在为空,因此会抛出一个NPEYes。您在所有传感器中使用相同的侦听器。