J'utilisais Sensor.TYPE_ORIENTATION
Pour déterminer l'angle actuel de l'appareil mais TYPE_ORIENTATION
Est déconseillé sur API version 8 . Dans le manuel SensorManager, il fait référence à la fonction getOrientation()
pour utiliser TYPE_ORIENTATION
.
Voici mon ancien code:
public void onSensorChanged(SensorEvent event) {
Log.d("debug","Sensor Changed");
if (event.sensor.getType()==Sensor.TYPE_ORIENTATION) {
Log.d("debug",Float.toString(event.values[0]));
float mAzimuth = event.values[0];
float mPitch = event.values[1];
float mRoll = event.values[2];
Log.d("debug","mAzimuth :"+Float.toString(mAzimuth));
Log.d("debug","mPitch :"+Float.toString(mPitch));
Log.d("debug","mRoll :"+Float.toString(mRoll));
}
}
Je suis vraiment confus à propos de l'utilisation de la fonction getOrientation()
, quelqu'un peut-il me montrer un exemple comment obtenir les angles?
Vous utilisez maintenant deux capteurs (ACCELEROMETER et MAGNETIC_FIELD) pour obtenir ces informations. Voir article de blog pour plus de détails.
public class CompassActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
Sensor accelerometer;
Sensor magnetometer;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(mCustomDrawableView); // Register the sensor listeners
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
float[] mGravity;
float[] mGeomagnetic;
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
azimut = orientation[0]; // orientation contains: azimut, pitch and roll
}
}
}
}
Autorisations:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
Concernant votre deuxième question. Lorsque vous enregistrez vos écouteurs de capteur, changez votre code pour lire:
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);
}
Google a une excellente application de démonstration pour l'orientation dans leur série de formation de développeur Google appelée TiltSpot . Parce qu'il a une licence Apache, j'ai pris la liberté de le transformer en une petite bibliothèque appelée johnnylambada-orientation qui rend l'orientation aussi simple en ajoutant ceci à votre activité:
getLifecycle().addObserver(new OrientationReporter(this, (a, p, r) -> {
Log.i("orientation","a="+a+" p="+p+" r="+r);
}));