2

「シェイク」イベントでいくつかの機能を接続しようとしています。ここでチュートリアルを使用しました:

http://www.vogella.com/articles/AndroidSensor/article.html

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html

OpenIntents のSensorSimulatorでテストしています。エミュレーターを SensorSimulator に接続できました。シミュレーターでデバイスを動かすと、エミュレーターの加速度計の読み取り値がシミュレーターの読み取り値と正確に一致します。

私のコードでは、次のようなログ ステートメントを追加しました。

public class ShakeEventListener implements SensorEventListener {

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();
Log.i("onSensorChanged", "accelationSquareRoot: " + accelationSquareRoot);

if (accelationSquareRoot >= 2) //
{
    if (actualTime - lastUpdate < 200) {
    return;
    }
    lastUpdate = actualTime;

        // Shake Detected
    Log.i("onSensorChanged", "Shakie Shakie!");
    }
}

public void onSensorChanged(SensorEvent se) {

    Log.d("onSensorChanged", "X: " + se.values[SensorManager.DATA_X] + 
               " Y: " + se.values[SensorManager.DATA_Y] + 
               " Z: " + se.values[SensorManager.DATA_Z]);

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

シミュレーターでデバイスを移動しても、log cat の出力は変わらないようです。常にこれらの測定値が表示されます (読み取り値は毎分何度も更新され続けますが、常に同じです):

05-22 15:09:07.717: I/onSensorChanged(686): accelationSquareRoot: 1.0006835
05-22 15:09:08.518: D/onSensorChanged(686): X: 0.0 Y: 9.77622 Z: 0.813417
05-22 15:09:08.518: I/onSensorChanged(686): accelationSquareRoot: 1.0006835

APIDemosサンプルを試してみましたsensors.javaが、同じ動作が登録されています。何が欠けている可能性がありますか?

4

2 に答える 2

3

これは、私のアプリで機能する加速度計のコードです。

// shake
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity


    //Shake
    private final SensorEventListener mSensorListener = new SensorEventListener() {
        int count = 0;
        public void onSensorChanged(SensorEvent se) {

          float x = se.values[0];
          float y = se.values[1];
          float z = se.values[2];
          mAccelLast = mAccelCurrent;
          mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
          float delta = mAccelCurrent - mAccelLast;
          mAccel = mAccel * 0.9f + delta; // perform low-cut filter
          if (mAccel > 5) {
              //do something
          }
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
      };

これが、このコード スニペットにたどり着いたソースです。

于 2012-05-24T18:40:09.833 に答える
1

私のゲームでは、ここからこのことを実装しました

サンプル コードは非常にシンプルで理解しやすいものです。

MyActivity.java

public class MyActivity extends Activity
{
    private MyView m_myView;
    private SensorManager m_sensorManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {           
        super.onCreate(savedInstanceState);

        m_myView = (MyView)findViewById(R.id.my_view);

        m_sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        m_sensorManager.registerListener(m_myView,
                SensorManager.SENSOR_ACCELEROMETER,
                SensorManager.SENSOR_DELAY_GAME);
    }

        @Override
        protected void onPause()
        {
                super.onPause();

                m_sensorManager.unregisterListener(m_myView);
        }

        @Override
        protected void onResume()
        {               
                super.onResume();

                m_sensorManager.registerListener(m_myView,
                        SensorManager.SENSOR_ACCELEROMETER,
                        SensorManager.SENSOR_DELAY_GAME;
        }
}

MyView.java

public class MyView extends View implements SensorListener
{
    private float m_totalForcePrev; // stores the previous total force value

    // do your constructor and all other important stuff here
    // make sure you set totalForcePrev to 0
    // ...

        public void onAccuracyChanged(int arg0, int arg1)
        {
                // I have no desire to deal with the accuracy events
        }

        public void onSensorChanged(int sensor, float[] values)
        {       
                if(sensor == SensorManager.SENSOR_ACCELEROMETER)
                {
                        double forceThreshHold = 1.5f;

                        double totalForce = 0.0f;
                        totalForce += Math.pow(values[SensorManager.DATA_X]/SensorManager.GRAVITY_EARTH, 2.0);
                        totalForce += Math.pow(values[SensorManager.DATA_Y]/SensorManager.GRAVITY_EARTH, 2.0);
                        totalForce += Math.pow(values[SensorManager.DATA_Z]/SensorManager.GRAVITY_EARTH, 2.0);
                        totalForce = Math.sqrt(totalForce);

                        if((m_gameState == STATE_RUNNING) && (totalForce < forceThreshHold) && (m_totalForcePrev > forceThreshHold))
                        {
                                doWrenchWord();
                        }

                        m_totalForcePrev = totalForce;
                }
        }

}

あなたの側の問題は、

getAccelerometer(se);関数のコードまたは、 SensorSimulatorをエミュレータに接続する際に間違いを犯した場合は、接続を切断して再接続する必要があると思います。IP とポート、設定タブを確認し、センサーが選択されているかどうか、または使用可能かどうかを確認します。また、更新と更新の遅延時間の追加設定もいくつかあります。ドキュメントに記載されている内容に従ってください。

于 2012-05-28T07:03:18.037 に答える