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?
- Dibujo en el aire con el teléfono Android
- Problemas relacionados con el giroscopio con la orientación del dispositivo
- Gyro Sensor drift y Estimación de ángulo correcto
- Sistema de Posicionamiento Interior basado en Giroscopio y Acelerómetro
- Combine giroscopio con acelerómetro para obtener el rumbo
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.
- Manera correcta de usar SOLO Giroscopio y Acelerómetro para obtener el ángulo de corriente fiable en cualquier eje de ANDROID
- ¿Cómo encontrar la distancia de desplazamiento utilizando sensor acelerómetro en smartphone android?
- Sensor de movimiento vertical
- Sensor.TYPE_ROTATION_VECTOR tiene deriva: ¿Hay una alternativa?
- Sensores para teléfonos móviles
- Ejemplos de giroscopios Android?
- Android detecta giroscopio disponible
- Conseguir vector de dirección en Android
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)
- Android: tener un servicio que se ejecuta todos los días a las 4 de la mañana
- Intención de tomar una foto con mejor resolución?