Wdrażam TIMER demonstracyjny, z Wibracją (w szczególnym stanie), Kiedy naciskam start, mój timer zaczyna działać ... a kiedy zatrzymam go za pomocą przycisku stop, po prostu się zatrzymuje.Wykrywaj ruch Dokładnie za pomocą akcelerometru w Androidzie
Teraz muszę zintegrować funkcjonalność, gdy osoba przesuwa urządzenie (gdy timer jest uruchomiony), powinien zresetować licznik czasu. Działa całkiem nieźle, ale funkcja akcelerometru nie działa absolutnie dokładnie. Wymaga szybkiego szarpnięcia, aby zresetować timer.
Zaproponuj mi dobre rozwiązanie dla tego samego.
Oto mój kod
public class SensorAccelerometer implements SensorEventListener {
private Context context;
private SensorManager sensorManager;
private Sensor accelerometer;
private TextView timelabel;
private Handler mHandler;
Runnable run;
private float mLastX, mLastY, mLastZ;
private final float NOISE = (float) 3.0;
public SensorAccelerometer(Context context) {
}
public SensorAccelerometer(Context context,TextView timelabel, Handler mHandler2, Runnable mUpdateTimeTask) {
// TODO Auto-generated constructor stub
this.context = context;
this.timelabel = timelabel;
this.mHandler = mHandler2;
this.run = mUpdateTimeTask;
initialiseSensor();
}
public void initialiseSensor(){
sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);
sensorManager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
}
public void unregisterSensor(){
sensorManager.unregisterListener(this);
Toast.makeText(context, "Sensor Stopped..", Toast.LENGTH_SHORT).show();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast=mAccelCurrent;
mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z);
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta;
if(mAccel>0.5){
TimerActivity.mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(run);
mHandler.postDelayed(run, 100);
}
}
czasowy aktywny
public class TimerActivity extends Activity {
public static long mStartTime = 0L;
private TextView mTimerLabel;
private Handler mHandler = new Handler();
String timerStop1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTimerLabel = (TextView) findViewById(R.id.textTimer);
Button timerStartButton = (Button) findViewById(R.id.btnTimer);
timerStartButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
if(mStartTime == 0L){
mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 100);
//activating the sensor and the acclerometer
SensorAccelerometer acc = new SensorAccelerometer(view.getContext(), mTimerLabel,mHandler,mUpdateTimeTask);
}
}
});
Button timerStopButton = (Button) findViewById(R.id.btnTimerStop);
timerStopButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
mHandler.removeCallbacks(mUpdateTimeTask);
mTimerLabel.setText(timerStop1);
mStartTime = 0L;
SensorAccelerometer scc = new SensorAccelerometer(view.getContext(),mTimerLabel,mHandler,mUpdateTimeTask);
scc.unregisterSensor();
}
});
}
private Runnable mUpdateTimeTask = new Runnable(){
public void run() {
final long start = mStartTime;
long millis = SystemClock.uptimeMillis()- start;
int seconds = (int) (millis/1000);
int minutes = seconds/60;
seconds = seconds % 60;
mTimerLabel.setText("" + minutes + ":"
+ String.format("%02d", seconds));
timerStop1 = minutes + ":"
+ String.format("%02d", seconds);
mHandler.postDelayed(this, 200);
}
};
protected void onPause() {
super.onPause();
SensorAccelerometer scc = new SensorAccelerometer(this,mTimerLabel,mHandler,mUpdateTimeTask);
scc.unregisterSensor();
};
}
Moje proste pytanie brzmi: jak sprawdzić dane pochylenia, (kiedy urządzenie jest przechylone) i chcę wykonać na nim zestaw kodu. czy masz jakieś rozwiązanie dotyczące powyższego kodu .. –
@stochastically. Pytanie moje jest takie samo jak powyżej. –
Myślałem, że chcesz użyć danych z akcelerometru do wykrycia ruchu. Aby to zrobić, musisz zrozumieć dane, stąd potrzeba ich zalogowania i spojrzenia na to. Jeśli chcesz tylko sprawdzić, kiedy urządzenie jest przechylone, to jest o wiele łatwiejsze. Na przykład zobacz mój odpowiednik [link] (http://stackoverflow.com/questions/16571798/android-device-angle-on-onical-axis-while-device-stays-still/16572641#16572641). Kąt pochylenia jest prawdopodobnie tym, czego szukasz. – Stochastically