Как использовать SensorManager.getOrientation () вместо TYPE_ORIENTATION

Я делаю приложение в android. В приложении есть некоторые кавычки, сохраненные в базе данных, и я хочу скопировать кавычки на экране с помощью датчиков телефона. Поэтому я хочу, чтобы, когда телефон движется влево, я вижу на экране следующую цитату, и когда я перемещаю телефон вправо, чтобы увидеть на экране предыдущую цитату. Какой тип сенсорного телефона лучше всего использовать? Я пытаюсь использовать Type_orientation, но у меня есть ошибка: эта константа была устарела в уровне API 8. Как я могу заменить ее на SensorManager.getOrientation (). Или вы думаете, есть ли какой-либо другой датчик, который лучше для меня использовать?

package com.example.prova1; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; public class SlideQuote extends Activity implements SensorEventListener { //a TextView private TextView quote; private TextView author; //the Sensor Manager private SensorManager sManager; float x; int id; int total; String s1,s2; Database quotedatabase = new Database(this); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.slide_quote); //get the TextView from the layout file quote = (TextView) findViewById(R.id.textView3); author = (TextView) findViewById(R.id.textView4); id=1; //get a hook to the sensor service sManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE); if(sManager.getSensorList(Sensor.TYPE_ORIENTATION).size()!=0){ Sensor s =sManager.getSensorList(Sensor.TYPE_ORIENTATION).get(o); sManager.registerListener(this,s ,SensorManager.SENSOR_DELAY_NORMAL); s1= quotedatabase.getQuote(id); s2= quotedatabase.getAuthor(id); total=quotedatabase.getQuotesCount(); quote.setText(s1); author.setText(s2); } } //when this Activity starts @Override protected void onResume() { super.onResume(); /*register the sensor listener to listen to the gyroscope sensor, use the callbacks defined in this class, and gather the sensor information as quick as possible*/ sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_NORMAL); } //When this Activity isn't visible anymore @Override protected void onStop() { //unregister the sensor listener sManager.unregisterListener(this); super.onStop(); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { //Do nothing. } @Override public void onSensorChanged(SensorEvent event) { //if sensor is unreliable, return void if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { return; } //else it will output the Roll, Pitch and Yawn values x=event.values[2]; if(x>25){ if(id==total) {id=1; } else{ id++; } s1= quotedatabase.getQuote(id); s2= quotedatabase.getAuthor(id); quote.setText(s1); author.setText(s2); } if(x<-25){ if(id==1) {id=total;} else{ id--;} s1= quotedatabase.getQuote(id); s2= quotedatabase.getAuthor(id); quote.setText(s1); author.setText(s2); } } @Override public void onBackPressed() { // TODO Auto-generated method stub sManager.unregisterListener(this); Intent backIntent = new Intent(getApplication(), Quote.class); finish(); startActivity(backIntent); } } 

На экране Android Motion Sensor приведены некоторые примеры использования датчиков:

Android Motion Sensor

Для гироскопа вы можете использовать следующий код:

 // Create a constant to convert nanoseconds to seconds. private static final float NS2S = 1.0f / 1000000000.0f; private final float[] deltaRotationVector = new float[4](); private float timestamp; public void onSensorChanged(SensorEvent event) { // This timestep's delta rotation to be multiplied by the current rotation // after computing it from the gyro sample data. if (timestamp != 0) { final float dT = (event.timestamp - timestamp) * NS2S; // Axis of the rotation sample, not normalized yet. float axisX = event.values[0]; float axisY = event.values[1]; float axisZ = event.values[2]; // Calculate the angular speed of the sample float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ); // Normalize the rotation vector if it's big enough to get the axis // (that is, EPSILON should represent your maximum allowable margin of error) if (omegaMagnitude > EPSILON) { axisX /= omegaMagnitude; axisY /= omegaMagnitude; axisZ /= omegaMagnitude; } // Integrate around this axis with the angular speed by the timestep // in order to get a delta rotation from this sample over the timestep // We will convert this axis-angle representation of the delta rotation // into a quaternion before turning it into the rotation matrix. float thetaOverTwo = omegaMagnitude * dT / 2.0f; float sinThetaOverTwo = sin(thetaOverTwo); float cosThetaOverTwo = cos(thetaOverTwo); deltaRotationVector[0] = sinThetaOverTwo * axisX; deltaRotationVector[1] = sinThetaOverTwo * axisY; deltaRotationVector[2] = sinThetaOverTwo * axisZ; deltaRotationVector[3] = cosThetaOverTwo; } timestamp = event.timestamp; float[] deltaRotationMatrix = new float[9]; SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); // User code should concatenate the delta rotation we computed with the current rotation // in order to get the updated rotation. // rotationCurrent = rotationCurrent * deltaRotationMatrix; } }