簡體   English   中英

Android傳感器數據

[英]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);
}       
}

您可以使用SensorEventtimestamp 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM