我想从我的Android智能手机中的加速计传感器中收集一些数据。我尝试了一些方法,最好的方法是使用服务类并在活动类中调用它,但是这个方法只给我三个那个时间的轴数据。 我的目的是从第二个到第二个收集数据,我的意思是每当数据发生变化时,它都会被记录在日志文件中,所以我可以从第二个数据中获得一些数据。
任何人都可以帮助我吗?我非常高兴能得到帮助。 非常感谢您的进步。
我已经在这里实现了它是我的活动代码
package trying.gapickerwithservice;
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.renderscript.Type;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class GAPickerWithService extends Activity implements SensorEventListener
{
Sensor mySens;
String giro;
EditText VALUE;
SensorManager sensorManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gapickerwserv);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor mySens = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
sensorManager.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.gapicker_with, menu);
return true;
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
VALUE = (EditText) findViewById(R.id.value);
float Roll = event.values[2];
float Pitch = event.values[1];
float Yaw = event.values[0];
giro = Float.toString(Pitch)+Float.toString(Roll)+Float.toString(Yaw);
VALUE.setText(giro);
// TODO Auto-generated method stub
}
protected void onResume(){
super.onResume();
sensorManager.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause(){
super.onPause();
sensorManager.unregisterListener(this);
}
}
这是我的服务代码
package trying.gapickerwithservice;
import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.util.Log;
import android.widget.EditText;
public class GAPickerGyroService extends Service implements SensorEventListener {
Sensor mySens;
static final String TAG = "GAPickerGyroService";
private SensorManager mySensMan;
String giro;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onCreate ()
{
mySensMan = (SensorManager) getSystemService(SENSOR_SERVICE);
mySens = mySensMan.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mySensMan.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float Roll = event.values[2];
float Pitch = event.values[1];
float Yaw = event.values[0];
giro = Float.toString(Pitch)+Float.toString(Roll)+Float.toString(Yaw);
Log.d(TAG, giro);
}
}
答案 0 :(得分:2)
您可以使用timestamp
的{{1}}每秒只保留一个数据集。但是,例如,它可能更好。收集您每秒获得的所有数据并计算这些值的平均值,并将平均结果存储为该秒的数据集。
实际存储数据的位置取决于您以后要用它做什么。您可以将其写入文件或数据库。
修改强>
实际上我想记录传感器数据(每次都是x,y和z值) 值已更改,它将附加成一行数据)
为此,只需将SensorEvent
替换为附加Log.d(TAG, giro)
的行添加到文件中(有很多关于如何执行此操作的示例)。
单击开始按钮
使用onClickListener设置一个开始按钮并在那里执行giro
。
并使用停止按钮停止记录
使用onClickListener设置一个停止按钮并在那里执行mySensMan.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL)
。
之后,我希望文本字段中显示的数据为字符串。
从您的文件中读取文本(再次提供大量示例)并使用TextView的mySensMan.unregisterListener(...)
来显示它。
小心 - 传感器可能会生成大量数据。
答案 1 :(得分:1)
我认为你需要在你的服务上实现监听器。看看SensorEventListener,你实现了像View.OnClickListener这样的界面,然后我觉得你很高兴!
您的代码确实有用......请在此处查看我的代码......
while(true)
{
//server accepts clients here
}
============================= XML ================= ============
package giveup.none.sensor;
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.util.Log;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends Activity implements SensorEventListener {
SensorManager sensorManager;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor s : list) {
Log.d("guang", s.getName());
}
List<Sensor> gyroList = sensorManager.getSensorList(Sensor.TYPE_GYROSCOPE);
Sensor gyroSensor;
if (!gyroList.isEmpty()) {
gyroSensor = gyroList.get(0);
} else {
return;
}
sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
tv.setText( Arrays.toString(sensorEvent.values));
Log.d("guang","changed: "+ Arrays.toString(sensorEvent.values));
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
如果您试图获得那些感性值对您来说意味着什么,请查看article。