Вектор вращения Android дает бесполезные результаты на Galaxy S8, но работает на Galaxy S5 - PullRequest
0 голосов
/ 20 февраля 2019

Я надеюсь, что кто-то может мне помочь.Я попытался получить угол азимута в 0-360 градусов от вектора вращения с помощью следующего кода:

package d.de.rotvectest;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements SensorEventListener
{
    private TextView azimuthTextView;
    private float[] rotationMatrix = new float[9];
    private float[] orientation = new float[3];
    private static final String azimuthFormatted = "Azimuth %.0f";

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

        this.azimuthTextView = findViewById(R.id.azimuthTextView);

        SensorManager sensorManager = (SensorManager)     getSystemService(Context.SENSOR_SERVICE);
    sensorManager.registerListener(this,     sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), 0);
    }

    @Override
    public void onSensorChanged(SensorEvent event)
    {
        if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR)
        {
            float[] values = event.values.clone();
            SensorManager.getRotationMatrixFromVector(this.rotationMatrix, values);
            float[] orientation = SensorManager.getOrientation(this.rotationMatrix, this.orientation);

            double azimuth = normalize(Math.toDegrees(orientation[0]));

            this.azimuthTextView.setText(String.format(azimuthFormatted,azimuth));
        }
    }

    /**
     * Normalises the given angle in degrees into range from 0 to 360 degrees.
     *
     * @param angle Angle which needs to be normalised
     * @return normalised angle in degrees
     */
    private double normalize(double angle)
    {
        double width = 360d - 0d;
        double offset = angle - 0d;

        return (offset - (Math.floor(offset / width) * width)) + 0d;
    }

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

Я запустил одно и то же приложение из AndroidStudio на двух устройствах и повернул их один раз вокруг оси z:

Samsung Galaxy S5 Вектор вращения работает правильно, и TextView показывает угол азимута от 0 до 360 градусов.

Samsung Galaxy S5

Samsung Galaxy S8 Вектор поворота показывает некоторые значения между 50 градусами, вскоре поднимается примерно до 100 градусов, и после поворота устройства он автоматически падает примерно до 50 градусов.Я не могу определить, изменилось ли что-то с уровня API 19, что могло бы вызвать это.

Samsung Galaxy S8

Это тот же код, поэтому я не знаю, как я могуисправить это.Даже темы «Изменения поведения» в Android API уровня 19–26 не отображают никакой информации.

...