Cómo obtener tiempo si alguna condición se reunió como giroscopio de lectura

Quiero almacenar el tiempo como "dateString" cuando gyroscope lectura x = 0.0, y = 0.0, z = 0.0 y cuando x> 0.0 && y> 0.0 && z> 0.0 tiempo de la tienda como "dateString1". No soy capaz de tiempo si la condición se cumple porque se está tomando la hora actual de mi teléfono. Se está ejecutando continuamente por lo que no es capaz de obtener el tiempo cuando el evento está sucediendo ¿cuál es la solución para el mismo?

Introduzca aquí la descripción de la imagen

Ejemplo: si mi teléfono está en reposo, el sensor de giroscopio proporcionará x = 0.0, y = 0.0, z = 0.0 si la lectura sigue siendo la misma durante tres horas. Supongamos que esta es la hora de inicio del sueño del teléfono. Cuando la lectura cambiará repentinamente en términos de x, y, z será tiempo de despertar.

¿Cómo se puede detectar este escenario (hora de inicio del sueño y hora de activación)?

Debajo del código está detectando la lectura x, y, z del giroscopio cuando todavía está mostrando 0.0.0.0.0.0 respectivamente.

Cuando pic hasta el valor de teléfono de x, y, z aumentar sólo Así que ¿cómo podemos agregar código para detectar el tiempo como el escenario anterior.

import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Calendar; public class Main extends Activity { Dbhelper myDb; //variable for x,y,z TextView textX, textY, textZ; Button ButtonView,ButtonAdd; TextView text1,text2,text3,text4 ; SensorManager sensorManager; Sensor sensor; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myDb =new Dbhelper(this); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); textX = (TextView) findViewById(R.id.textX); textY = (TextView) findViewById(R.id.textY); textZ = (TextView) findViewById(R.id.textZ); text1 = (TextView) findViewById(R.id.text1); text2 = (TextView) findViewById(R.id.text2); text3 = (TextView) findViewById(R.id.text3); text4 = (TextView) findViewById(R.id.text4); ButtonView=(Button)findViewById(R.id.button_view); ButtonAdd=(Button)findViewById(R.id.button_add); AddData(); viewAll(); } public void AddData() { ButtonAdd.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { boolean isInserted = myDb.insertData(text1.getText().toString(), textX.getText().toString(), textY.getText().toString(), textZ.getText().toString()); if (isInserted == true) Toast.makeText(Main.this, "Data Inserted", Toast.LENGTH_LONG).show(); else Toast.makeText(Main.this, "Data not Inserted", Toast.LENGTH_LONG).show(); } } ); } public void viewAll() { ButtonView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Cursor res = myDb.getAllData(); if(res.getCount() == 0) { // show message showMessage("Error","Nothing found"); return; } StringBuffer buffer = new StringBuffer(); while (res.moveToNext()) { buffer.append("ID :"+ res.getString(0)+"\n"); buffer.append("TIME :"+res.getString(1)+"\n"); buffer.append("X :"+ res.getString(2)+"\n"); buffer.append("Y :"+ res.getString(3)+"\n"); buffer.append("Z :"+ res.getString(4)+"\n\n"); } // Show all data showMessage("Data",buffer.toString()); } } ); } public void showMessage(String title,String Message){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setTitle(title); builder.setMessage(Message); builder.show(); } public void onResume() { super.onResume(); sensorManager.registerListener(gyroListener, sensor,SensorManager.SENSOR_DELAY_NORMAL); } public void onStop() { super.onStop(); sensorManager.unregisterListener(gyroListener); } public SensorEventListener gyroListener = new SensorEventListener() { public void onAccuracyChanged(Sensor sensor, int acc) { } public void onSensorChanged(SensorEvent event) { long timeStamp = event.timestamp; double x = event.values[0]; x=(double)Math.round(x * 10d) / 10d; //x=Math.round(2); double y = event.values[1]; y=(double)Math.round(y * 10d) / 10d; double z = event.values[2]; z=(double)Math.round(z * 10d) / 10d; textX.setText("X : " + x ); textY.setText("Y : " + y ); textZ.setText("Z : " + z ); Calendar c2 = Calendar.getInstance(); SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss"); String dateString1 =sdf1.format(c2.getTime()); int timeOfDay = c2.get(Calendar.HOUR_OF_DAY); c2.getTime(); Calendar c1 = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); String dateString =sdf.format(c1.getTime()); int timeOfDay1 = c1.get(Calendar.HOUR_OF_DAY); c1.getTime(); if(timeOfDay >= 11 && timeOfDay <= 20 && x==0 && y==0 && z==0) text1.setText("phone is not moving" + dateString); else if (timeOfDay1 >= 11 && timeOfDay1 <= 20 && x>0 || y>0 || z>0) text2.setText("phone is just moved " + dateString1); else if(timeOfDay >= 11 && timeOfDay <= 20 ) text3.setText("Were phone asleep between "+ dateString + "&" + dateString1); } }; } 

Main.xml

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <TextView android:id="@+id/textX" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:text="" /> <TextView android:id="@+id/textY" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:textSize="30sp" android:text="" /> <TextView android:id="@+id/textZ" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:textSize="30sp" android:text="" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:textSize="30sp" android:text="" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:textSize="30sp" android:text="" /> <TextView android:id="@+id/text3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:textSize="30sp" android:text="" /> </LinearLayout> 

NOTA: Por favor no diga que Timestamp es una solución que ya he probado.

En SensorEventListener puede utilizar el parámetro de devolución de llamada SensorEvent event para obtener la marca de tiempo utilizando el código a continuación,

 long timeStamp = event.timestamp; 

Nota: event.timestamp volverá largo.

EDIT: Respuesta actualizada basada en su comentario.

Para comprobar si el dispositivo no se ha movido durante más de tres horas, utilice el siguiente código.

Inicializar long lastTimeStamp = 0; En su variable global en su clase.

 SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; if(Math.round(x) == 0 && Math.round(y) == 0 && Math.round(z) == 0) { //device didn't move - store current timestamp lastTimeStamp = event.timestamp; } else { //below if condition is to check if device hasn't been idle if (lastTimeStamp == 0) { return; } //(3 * 60 * 60 * 1000) checks if device wasn't moved for more than 3 hours if ((event.timestamp - lastTimeStamp) > (3 * 60 * 60 * 1000)) { //code goes here } lastTimeStamp = 0; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; 

Espero que esto da más claridad.

Puede obtener sensores de tiempo de lectura por sensor.timestamp y utilizar este en lugar de getTime ()

(Permítanme corregir mi error aquí, puede obtener el tiempo por event.timestamp () no sensor.timestamp)

  • ¿Cómo medir la velocidad del coche por teléfono con acelerómetro y giroscopio?
  • ¿Podemos dibujar línea en lienzo android entre dos puntos dados por giroscopio?
  • ¿Cómo obtener el azimut de un teléfono con lecturas de brújula y lecturas de giroscopio?
  • Uso de giroscopio Android en lugar de acelerómetro. Encontré un montón de fragmentos, pero no hay código completo
  • Unity3D Android acelerómetro y giroscopio controles
  • Valor de Android: Sensor.getResolution ()
  • Filtro complementario (Gyro + accel) con Android
  • Android Gyroscope versículo Acelerómetro
  • Cuándo usar acelerómetro o giroscopio en Android
  • Obtener rotación y mostrar en grados
  • Android obtiene aceleración normalizada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.