Sensor.TYPE_ORIENTATION
устарела и не должна использоваться.
Чтение ориентации устройства также дало мне головную боль.Вот базовый класс, который я использую для действий, для которых требуется ориентация устройства:
public abstract class SensorActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private final float[] accelerometerValues = new float[3];
private final float[] R = new float[9];
private final float[] I = new float[9];
private final float[] orientation = new float[3];
private final float[] remappedR = new float[9];
private final List<HasOrientation> observers = new ArrayList<HasOrientation>();
private int x;
private int y;
protected SensorActivity() {
this(SensorManager.AXIS_X, SensorManager.AXIS_Y);
}
/**
* Initializes a new instance.
*
*/
protected SensorActivity(int x, int y) {
setAxisMapping(x, y);
}
/**
* The parameters specify how to map the axes of the device to the axes of
* the sensor coordinate system.
*
* The device coordinate system has its x-axis pointing from left to right along the
* display, the y-axis is pointing up along the display and the z-axis is pointing
* upward.
*
* The <code>x</code> parameter defines the direction of the sensor coordinate system's
* x-axis in device coordinates. The <code>y</code> parameter defines the direction of
* the sensor coordinate system's y-axis in device coordinates.
*
* For example, if the device is laying on a flat table with the display pointing up,
* specify <code>SensorManager.AXIS_X</code> as the <code>x</code> parameter and
* <code>SensorManager.AXIS_Y</code> as the <code>y</code> parameter.
* If the device is mounted in a car in landscape mode,
* specify <code>SensorManager.AXIS_Z</code> as the <code>x</code> parameter and
* <code>SensorManager.AXIS_MINUS_X</code> as the <code>y</code> parameter.
*
* @param x specifies how to map the x-axis of the device.
* @param y specifies how to map the y-axis of the device.
*/
public void setAxisMapping(int x, int y) {
this.x = x;
this.y = y;
}
/**
* Registers an orientation observer.
*
* @param hasOrientation is the observer to register.
*/
protected void register(HasOrientation hasOrientation) {
observers.add(hasOrientation);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
sensorManager.unregisterListener(this);
super.onPause();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
System.arraycopy(event.values, 0, accelerometerValues, 0, accelerometerValues.length);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
if (SensorManager.getRotationMatrix(R, I, accelerometerValues, event.values)) {
if (SensorManager.remapCoordinateSystem(R, x, y, remappedR)) {
SensorManager.getOrientation(remappedR, orientation);
for (HasOrientation observer : observers) {
observer.onOrientation(Orientation.fromRadians(orientation));
}
}
}
break;
default:
throw new IllegalArgumentException("unknown sensor type");
}
}
}
Ориентация выглядит так:ориентация выровнена по книжной или альбомной ориентации.Я вызывал его только из конструктора, поэтому не могу сказать вам, что происходит, когда вы вызываете его во время выполнения действия.Возможно, вам придется сбросить матрицы.