Я надеюсь, что кто-то может мне помочь.Я попытался получить угол азимута в 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 S8 Вектор поворота показывает некоторые значения между 50 градусами, вскоре поднимается примерно до 100 градусов, и после поворота устройства он автоматически падает примерно до 50 градусов.Я не могу определить, изменилось ли что-то с уровня API 19, что могло бы вызвать это.
Это тот же код, поэтому я не знаю, как я могуисправить это.Даже темы «Изменения поведения» в Android API уровня 19–26 не отображают никакой информации.