簡體   English   中英

同時實現陀螺儀和加速度計?

[英]Implement both gyroscope and accelerometer?

我想在手機中獲取陀螺儀和加速度計的值。 以下是我的代碼

public class MainActivity extends Activity implements  SensorEventListener{

    private SensorManager sensorManager;
    private long lastUpdate;
    private GPSTracker gpss;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        lastUpdate = System.currentTimeMillis();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


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

    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER && event.sensor.getType() == Sensor.TYPE_GRAVITY) {
              getAccelerometer(event);
            }
    }


    private void getAccelerometer(SensorEvent event) {
        // TODO Auto-generated method stub
        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 >= 10) //
        {
          if (actualTime - lastUpdate < 200) {
            return;
          }
          lastUpdate = actualTime;
          gpss = new GPSTracker(MainActivity.this);
           if(gpss.canGetLocation()){

              double latitude = gpss.getLatitude();
              double longitude = gpss.getLongitude();

              // \n is for new line
              Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();    
          }else{
              // can't get location
              // GPS or Network is not enabled
              // Ask user to enable GPS/network in settings
              gpss.showSettingsAlert();
          }
        }

    }

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

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


}

如果我使用的代碼工作正常

@Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                  getAccelerometer(event);
                }
        }

但是,當我包含* TYPE_GRAVITY *時,它不起作用。 我想我在getType()函數中犯了錯誤。 有人可以告訴我同時檢測兩個事件的正確語法嗎?

在您的代碼中:

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER 
        && event.sensor.getType() == Sensor.TYPE_GRAVITY) {
        getAccelerometer(event);
        }
}

您正在獲取事件類型的值,並立即詢問是否是兩個不同的事物。 這與擁有:

int a = 1;
if (a == 1 && a == 2)  { ... }

每個SensorEvent都將只有一種類型。 如果要在兩種情況下都調用方法,請使用|| 而不是&&在您的條件中。

如果您想獨立行動,則需要進行兩項檢查。 switch()是一個很好的方法:

@Override
public void onSensorChanged(SensorEvent event) {

    switch(event.sensor.getType()) {

        case Sensor.TYPE_ACCELEROMETER:
            getAccelerometer(event);
            break;
        case Sensor.TYPE_GRAVITY:
            doSomethingDifferent();
            break;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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