私は動きを検出するためService
に実装する Android を持っています。ユーザーがモーション検出を有効または無効にすることを選択できる場所がありますSensorEventListener
。CheckBoxPreference
私が直面している問題は、サービス、つまりOnSensorChanged
メソッドで正しい値を取得できないことです。
アプリケーションを起動するとすぐにサービスが開始されます。サービスを開始し、それにバインドされるアクティビティがあります。
モーションの変化を検出するサービス:
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;
}
});
}
そのため、チェックしてチェックを外すと、 のログに と の値SettingsActivity
が変更されていることが示されますが、 のメソッドには反映されません。MotionService.SHAKE_ENABLE
MotionService.SHAKE_THRESHOLD
OnSensorChanged
MotionService
どこが間違っていますか?助けて感謝!