나는 움직임을 감지하기 위해 SensorEventListener
을 구현하는 Android Service
이 있습니다. 나는 CheckBoxPreference
을 가지고 있는데, 사용자가 모션 디텍션을 켜거나 끌 수 있습니다. 내가 직면하고있는 문제는 서비스에서 올바른 값을 얻을 수 없다는 것인데, 즉 OnSensorChanged
메서드에서 발생합니다.Android : 서비스에서 ChekboxPreference 값 읽기
서비스가 시작되는 즉시 서비스가 시작됩니다. 서비스를 시작하는 활동이 있고 그 활동에 묶여 있습니다.
public class MotionService extends Service implements SensorEventListener{
public static int SHAKE_THRESHOLD = 0;
public static boolean SHAKE_ENABLE = false;
@Override
public void onCreate() {
if (D) Log.d(TAG, "Creating service");
super.onCreate();
SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60)*10;
SHAKE_ENABLE = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("shake_enable",false);
}
@Override
public void onSensorChanged(SensorEvent event) {
Sensor mySensor = event.sensor;
if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000;
Log.d("Sensor Changed",SHAKE_THRESHOLD+"================="+SHAKE_ENABLE); //values here remain the same ones i assign on OnCreate, even though i change it in the settings. It should change when i change from settings. NOT HAPPENING!!
if (speed > SHAKE_THRESHOLD) {
//do sensor related stuffs here
if (SHAKE_ENABLE) { //the boolean value i get from the preferences
if ((x) > 8.0000) {
Log.d("sensor", "=====LEFT====");
} else if ((x) < -8.0000) {
Log.d("sensor", "=====RIGHT====");
} else if ((z) < -0.0) {
Log.d("sensor", "=====UP====");
} else if ((y) < 1.0) {
Log.d("sensor", "=====DOWN====");
}
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
}
}
그리고 이것은 내 취향 활동이다 : 나는 움직임의 변화를 감지
서비스 나 확인 그래서
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Fade it in
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
addPreferencesFromResource(R.xml.settings);
final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager().findPreference("shake_enable");
checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.d("MyApp", "Pref " + preference.getKey() + " changed to " + newValue.toString());
if (newValue.toString().equals("true")){
MotionService.SHAKE_ENABLE=true;
Log.d("SHAKE_ENABLE",MotionService.SHAKE_ENABLE+"================="+MotionService.SHAKE_THRESHOLD);
MotionService.SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60);
}
else{
MotionService.SHAKE_ENABLE=false;
Log.d("SHAKE_ENABLE",MotionService.SHAKE_ENABLE+"================="+MotionService.SHAKE_THRESHOLD);
MotionService.SHAKE_THRESHOLD = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("shake_threshold",60);
}
return true;
}
});
}
및 unchek을의 SettingsActivity
쇼에서 로그 그 MotionService.SHAKE_ENABLE
의 값 및 MotionService.SHAKE_THRESHOLD
이 변경되었지만 MotionService
의 OnSensorChanged
방법에 반영되지 않았습니다.
어디로 잘못 가고 있습니까? 도움이 감사합니다!
나는 getDefaultSharedPreferences()를 사용하여 OnSensorChanged 메소드에서이를 시도했다. 체크 박스를 선택/해제 한 후에도 값은 변경되지 않습니다. – PsyGik