5

私は自分の携帯電話の向きを取得したいのですが、多くの人が使用しているこのコードを使用しています。これがコードです

    public void onSensorChanged(SensorEvent event) {
    //if the data sensor is unreliabel
    if(event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    //gets the value
    switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        gravity = event.values.clone();
        break;

    case Sensor.TYPE_MAGNETIC_FIELD:
        geomag = event.values.clone();
        break;
    }
    getOrientation();
}

private void getOrientation(){

    //if gravity n geomag have value, find the rotation matrix
            if(gravity != null && geomag != null){

                //check the rotation matrix found
                boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);

                if(success){
                    SensorManager.getOrientation(inR, orientVals);
                    azimuth = Math.toDegrees(orientVals[0]);

                    TextView azi = (TextView) findViewById(R.id.textAzi);
                    azi.setText("azi : " + azimuth);

                }
                TextView cek = (TextView) findViewById(R.id.cek);
                cek.setText("rotation: "+success);
            }   

しかし、なぜ getrotationmatrix は常に false に戻るのでしょうか? 問題はどこだ?

4

3 に答える 3

5

もう一度試して解決策を見つけましたが、コードを次のように変更します

    public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        for(int i=0; i<3; i++){
            accelValues[i] =  event.values[i];
        }
        if(compassValues[0] != 0)
            ready = true;

        break;

    case Sensor.TYPE_MAGNETIC_FIELD:
        for(int i=0; i<3; i++){
            compassValues[i] = event.values[i];
        }
        if(accelValues[2] != 0)
            ready = true;

        break;
    }

    if(!ready)
        return;

    boolean cek = SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues);

    if(cek){
        SensorManager.getOrientation(inR, prefValues);
        mInclination = SensorManager.getInclination(inclineMatrix);

        //display every 30th values
        if(counter++ % 30 == 0){
            //do your code, what you want to do to the result
            counter = 1;
        }
    }

そしてすべてがうまくいく

于 2013-01-08T21:12:46.540 に答える
3

加速度計、マグメティックフィールド、ジャイロ(オプション)を聞くためにリスナーを登録していることを確認してください。これは、onResumeメソッドで行います。これを忘れると、getRotationMatrixを呼び出すときに「false」の戻り値が返されます。

これがお役に立てば幸いです。

   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

   mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

   // do more staff here..
   }


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

    mSensorManager.registerListener(
            this, 
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
             SensorManager.SENSOR_DELAY_NORMAL );
          mSensorManager.registerListener(
            this, 
            mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
            SensorManager.SENSOR_DELAY_NORMAL );
          mSensorManager.registerListener(
                this, 
                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 
                SensorManager.SENSOR_DELAY_NORMAL );


}

protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
}
于 2013-01-22T15:20:49.760 に答える