[英]Android Sensor Data
我想從我的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);
}
}
您可以使用SensorEvent
的timestamp
SensorEvent
只保留一個數據集。 但是,最好是收集每秒獲得的所有數據並計算這些值的平均值,並將平均結果存儲為該秒的數據集。
實際存儲數據的位置取決於您以后要用它做什么。 您可以將其寫入文件或數據庫。
編輯
實際上我想記錄傳感器數據(x,y和z值,每次更改的值都會附加成一行數據)
為此,只需將你的Log.d(TAG, giro)
替換為一個附加giro
到一個文件的行(有很多關於如何做到這一點的例子)。
單擊開始按鈕
使用mySensMan.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL)
設置一個開始按鈕,並在mySensMan.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL)
執行mySensMan.registerListener(this, mySens, SensorManager.SENSOR_DELAY_NORMAL)
。
並使用停止按鈕停止記錄
設置一個帶有mySensMan.unregisterListener(...)
的停止按鈕,並在那里執行mySensMan.unregisterListener(...)
。
之后,我希望文本字段中顯示的數據為字符串。
從文件中讀取文本(再次,有大量示例)並使用TextView的setText()
來顯示它。
注意 - 傳感器可能會生成大量數據。
我認為你需要在你的服務上實現監聽器。 看看SensorEventListener ,你實現了像View.OnClickListener這樣的接口,那么我覺得你很高興!
你的代碼實際上有效...在這里查看我的代碼......
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) {
}
}
============================= XML ==================== =========
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
如果你試圖得到那些感官價值對你意味着什么,請查看這篇文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.