2012-08-31 27 views
2

我有一個應用程序,我想要將傳感器數據合併到。我的第一步是創建一個只讀取傳感器數據並將其顯示在屏幕上的應用程序。我所做的大多數研究都指向了諸如Lars Vogel's之類的教程。不幸的是,這是我卡住的地方。我已經基本上將他的代碼複製粘貼到我的項目中,儘管應用程序運行,但它不顯示任何數據。無法從Android中的傳感器讀取

下面是我使用的代碼:

package com.example.sensortest;  

import android.graphics.Color; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

public class sensortest extends Activity implements SensorEventListener{ 
    private SensorManager mSensorManager; 
    private Sensor mSensor; 
    RelativeLayout rlsensortest; 
    TextView tvOutput; 
    Button btnStart, btnStop; 
    Boolean blnScan=false; 

    private Handler mHandler = new Handler(); 
    private long mStartTime=0L; 
    private long lElapsedTime=0; 

    private boolean color = false; 
    private long lastUpdate;   

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     //mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);  

     LayoutInflater layoutInflater = this.getLayoutInflater(); 

     rlsensortest = (RelativeLayout) layoutInflater.inflate(R.layout.activity_asphalt_alert,null);  
     tvOutput = (TextView) rlsensortest.findViewById(R.id.txtOutput);   
     tvOutput.setText("Initialized...\n"); 

     btnStart = (Button) rlsensortest.findViewById(R.id.btnStart); 
     btnStop = (Button) rlsensortest.findViewById(R.id.btnStop); 

     btnStart.setOnClickListener(mButtonListener); 
     btnStop.setOnClickListener(mButtonListener); 

     lastUpdate = System.currentTimeMillis(); 

     setContentView(rlsensortest);   
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_asphalt_alert, menu); 
     return true; 
    } 
    // Create an anonymous implementation of OnClickListener 
    private OnClickListener mButtonListener = new OnClickListener() { 
     String strMessage =""; 
     public void onClick(View v) { 
      if (v == btnStart){ 
       strMessage = "Starting sensor scan."; 
       blnScan=true; 
      // mStartTimer(); 

      } else if (v == btnStop){ 
       strMessage = "Stoping sensor scan."; 
       blnScan=false; 
      // mStopTimer(); 
      } 
      if (strMessage != "") 
       Toast.makeText(rlsensortest.getContext(), strMessage, Toast.LENGTH_SHORT).show(); 

      strMessage = ""; 
     } 
    }; 



    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
/*  String strEvent = ""; 
     strEvent = "this is a test"; 
     tvOutput.setText(tvOutput.getText() + strEvent + "Another line\n"); */ 

     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      getAccelerometer(event); 
     }  

    } 
    private void getAccelerometer(SensorEvent event) { 
     float[] values = event.values; 
     // Movement 
     float x = values[0]; 
     float y = values[1]; 
     float z = values[2]; 

     float accelationSquareRoot = (x * x + y * y + z * z) 
      /(SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH); 
     long actualTime = System.currentTimeMillis(); 
     if (accelationSquareRoot >= 2) // 
     { 
      if (actualTime - lastUpdate < 200) { 
      return; 
      } 
      lastUpdate = actualTime; 
      Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT) 
       .show(); 
      if (color) { 
      tvOutput.setBackgroundColor(Color.GREEN); 

      } else { 
      tvOutput.setBackgroundColor(Color.RED); 
      } 
      color = !color; 
     } 
     } 
} 

在這一點上,當手機正在動搖,它應該(至少)給敬酒,說事件發生。任何想法我做錯了什麼?任何幫助表示讚賞

回答

2

它看起來像你從來沒有做任何與mSensorManager。您需要先收到Sensor,然後才能收到SensorEventListener回叫。獲取/釋放Sensor通常發生在onResume/。從Lars Vogel's Sensor tutorial

實施例:

@Override 
    protected void onResume() { 
    super.onResume(); 
    // register this class as a listener for the orientation and 
    // accelerometer sensors 
    mSensorManager.registerListener(this, 
     mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
     SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onPause() { 
    // unregister listener 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
    } 
+0

哇。謝謝。多麼簡單/愚蠢的錯誤。我只能宣稱缺乏睡眠和生鏽。 – WyldeRhide

1

添加到您的活動:

@Override 
protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, 
      mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
}