Я использую демонстрационный ТАЙМЕР с вибрацией (при определенном условии), Когда я нажимаю кнопку запуска, мой таймер начинает работать .. и когда я останавливаю его с помощью кнопки остановки, он просто останавливается.Обнаружение движения с использованием Accelerometer в Android
Теперь мне нужно интегрировать функциональность, когда человек переводит устройство (пока таймер работает), он должен сбросить таймер. Он работает очень хорошо, но функциональность акселерометра работает не совсем точно. Для сброса таймера требуется быстрый рывок.
Предложите мне хорошее решение для того же.
Вот мой код
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);
}
}
Таймер активности
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();
};
}
Мой простой вопрос - как проверить данные наклона (когда устройство наклонено), и я хочу выполнить набор кода на нем. у вас есть какое-либо решение в отношении вышеуказанного кода. –
@stochastically. Мой вопрос такой же, как и выше –
Я думал, что вы хотите использовать данные акселерометра для обнаружения движения. Для этого вам нужно понять данные, поэтому необходимо занести их в журнал и посмотреть на него. Если вы просто хотите проверить, когда устройство наклонено, это намного проще. Например, см. Мой answser [ссылка] (http://stackoverflow.com/questions/16571798/android-device-angle-on-vertical-axis-while-device-stays-still/16572641#16572641). Угол наклона, вероятно, то, что вы ищете. – Stochastically