罗盘应用程序出现问题-为什么^

时间:2020-04-18 17:10:44

标签: java android accelerometer sensors magnetometer

我制作了一个指南针应用程序,当您在真实设备中运行它时,它似乎可以正常工作,因为指南针从一个点移动到另一个点。但是,如果您运行手机默认的指南针应用程序,则会看到指针指向远处。实际上,您会注意到android-studio制作的应用程序运行异常,并且针未正确移动。我认为问题与图像动画无关,而与访问传感器的代码有关。

我将主要代码留在下面:

public class MainActivity extends AppCompatActivity implements SensorEventListener { 
    Float azimuth_angle; 
    private SensorManager compassSensorManager;
    Sensor accelerometer; 
    Sensor magnetometer;
    TextView tv_degrees; 
    ImageView iv_compass; 
    private float current_degree = 0f; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        compassSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
        accelerometer = compassSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
        magnetometer = compassSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

    protected void onResume(){
        super.onResume();
        compassSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
        compassSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
    }

    protected void onPause(){
        super.onPause();
        compassSensorManager.unregisterListener(this); 
    }

    float[] accel_read; 
    float[] magnetic_read; 

    @Override
    public void onSensorChanged(SensorEvent event) { 
        tv_degrees = (TextView)findViewById(R.id.tv_degrees); 
        iv_compass = (ImageView)findViewById(R.id.iv_compass); 

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
            accel_read = event.values;
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
            magnetic_read = event.values;

        if (accel_read != null && magnetic_read != null){ 
            float R[] = new float[9];
            float I[] = new float[9];
            boolean successful_read = SensorManager.getRotationMatrix(R, I, accel_read, magnetic_read); 

            if (successful_read) { 
                float orientation[] = new float[3]; 
                SensorManager.getOrientation(R, orientation); 
                azimuth_angle = orientation[0]; 
                float degrees = ((azimuth_angle *180f) / 3.14f); 
                int degreesInt = Math.round(degrees); 
                tv_degrees.setText(Integer.toString(degreesInt) + (char) 0x00B0 + " to absolute north."); 
                RotateAnimation rotate = new RotateAnimation(current_degree, -degreesInt, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
                rotate.setDuration(100); 
                rotate.setFillAfter(true);

                iv_compass.startAnimation(rotate); 
                current_degree = -degreesInt; 
            }
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }
}

如果您知道怎么了,请告诉我。而且,如果您需要更多信息,请随时提出要求。

谢谢。

0 个答案:

没有答案