2014-06-16 55 views
3

我在SensorManager.unregisterListener中遇到了一些問題。它們與Android, Thread, Cannot unregister SensorEventListenerSensorEventListener doesn't get unregistered with unregisterListener() method相似。但我找不到我的答案!我也遵循SensorManager文檔示例http://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_DELAY_UIAndroid傳感器偵聽器未得到未註冊或傳感器仍檢索值

問題是活動完成後,我取消註冊偵聽器,但傳感器不斷髮送值直到應用程序被完全銷燬。

這是我的代碼:

我SensorController實現SensorEventListener

public class SensorController implements SensorEventListener{ 

構造:

public SensorController(Context context){ 
    sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
} 
當活動的的onResume回調被稱爲

我SensorController的onResume方法被稱爲:

public void onResume(){ 
    mAccelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    boolean ret1 = sensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_UI); 
    mMagneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    boolean ret2 = sensorManager.registerListener(this, mMagneticSensor, SensorManager.SENSOR_DELAY_UI); 

} 

我SensorController的onPause方法被調用時,活動的回調的onPause被稱爲:

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

並在SensorChanged我把日誌監視傳感器事件:

@Override 
public void onSensorChanged(SensorEvent event) { 
    this.computeRotationAngles(event); 
    Log.i("SensorController", "onSensorChanged"); 
} 

所以......活動結束後onPause方法,onSensorChanged(SensorEvent事件)仍然檢索傳感器事件。爲什麼??我在SensorController.onPause()函數中取消註冊它。傳感器檢索出很好的值,但我無法阻止它們發送。我究竟做錯了什麼?

非常感謝您提前!我將不勝感激每一個小技巧:)

+0

具有u受審sensorManager.registerListener(NULL) – Rohit

+0

http://stackoverflow.com/questions/11071035/unregistering-sensormanager-doesnt-work – Rohit

+0

是。我已經嘗試了SensorManager = null和sensorManager.registerListener(null),並且我仍然從傳感器獲取值。 –

回答

1

嘗試卸載應用程序並重新安裝。它適用於我的。

1

我面臨類似的問題。

避免傳感器電量耗盡的解決方法。

我使用了一個靜態布爾值mIsSensorUpdateEnabled。當您想停止從傳感器獲取值時,將其設置爲'假'。 並在onSensorChanged()方法中,檢查布爾變量的值,並再次調用以取消註冊傳感器。這一次,它工作。傳感器將被取消註冊,並且您將不再獲得傳感器更改回調。

public class MainActivity extends Activity implements SensorEventListener { 
    private static boolean mIsSensorUpdateEnabled = false; 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 

    @override 
    protected void onCreate(){ 
     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    } 

    private startSensors(){ 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     int delay = 100000; //in microseconds equivalent to 0.1 sec 
     mSensorManager.registerListener(this, 
       mAccelerometer, 
       delay 
     ); 
     mIsSensorUpdateEnabled =true; 
    } 

    private stopSensors(){ 
     mSensorManager.unregisterListener(this, mAccelerometer); 
     mIsSensorUpdateEnabled =false; 
    } 


    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (!mIsSensorUpdateEnabled) { 
      stopSensors(); 
      Log.e("SensorMM", "SensorUpdate disabled. returning"); 
      return; 
     } 
     //Do other work with sensor data 
    } 
}