У меня проблема с приложением компаса - почему ^ - PullRequest
0 голосов
/ 18 апреля 2020

Я создал приложение для компаса, и оно, кажется, работает правильно, когда вы запускаете его на реальном устройстве, потому что компас перемещается из одной точки в другую. Но если вы запустите приложение компаса телефона по умолчанию, вы увидите, что стрелка указывает в сторону. На самом деле, вы заметите, что приложение, созданное студией android, работает странно и игла движется неправильно. Я думаю, что проблема не имеет ничего общего с анимацией изображения, а с кодом доступа к датчикам.

Я оставляю вам основной код внизу:

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) {

    }
}

Пожалуйста, если вы знаете, что не так , скажите мне. И если вам нужна дополнительная информация, не стесняйтесь спрашивать ее.

Спасибо.

...