Android – how to get time if some conditions encounter gyroscope reading
Invalid Sign
Example – if my phone is stationary, the gyro sensor will provide x = 0.0, y = 0.0, z = 0.0. If the reading is still the same within three hours. Suppose this is the start time of phone sleep. When the reading will suddenly change in X, y, Z, it will be the wake-up time
How do I detect this (sleep start time and wake-up time)?
The following code is to detect the gyro readings x, y and Z, which still display 0.0, 0.0 and 0.0 respectively
When the telephone values of PIC, x, y, Z increase, how can we add code to detect time, as described above
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);
}
};
}
In 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>
Note: please do not tell me that timestamp is the solution I have tried
resolvent:
In the sensoreventlistener, you can use the callback parameter sensorevent event to obtain the timestamp using the following code,
long timeStamp = event.timestamp;
Note: event.timestamp will return long
Edit: update the answers based on your comments
To check if the device has moved for more than three hours, use the following code
Initialize long lasttimestamp = 0; In the global variable of your class
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) {
}
};
I hope this will be clearer