Android传感器数据

时间:2015-11-10 10:29:50

标签: android android-sensors

我想从我的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);
}       
}

2 个答案:

答案 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) {

    }
}

enter image description here 如果您试图获得那些感性值对您来说意味着什么,请查看article