2013-03-04 4 views
2

Je tente d'obtenir l'orientation sur mon émulateur Android par SensorManager.getOrientation. Avant cela, j'utilise SensorManager.getRotationMatrix pour obtenir la matrice de rotation, mais cela retourne toujours false. Voici le code de mon activité: SensorManager.getRotationMatrix retourne toujours false sur Android Emulator


public class MainActivity extends Activity implements SurfaceHolder.Callback, View.OnClickListener{

public final static String DEBUG_TAG = "MainActivity"; private SensorManager sensorManager; private SurfaceView preview; private float[] mGravs; private float[] mGeoMags; private float[] mRotationM; private float[] mOrientation; private Sensor mAccelerometer; private Sensor mMagneticField; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); preview = (SurfaceView)findViewById(R.id.SurfaceView1); sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mGravs = new float[3]; mGeoMags = new float[3]; mRotationM = new float[16]; mOrientation = new float[3]; List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL); for (int nI = 0; nI < sensorList.size(); nI++) { Log.d(DEBUG_TAG, sensorList.get(nI).getName()); } } private SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { synchronized (this) { switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: System.arraycopy(event.values, 0, mGravs, 0, 3); break; case Sensor.TYPE_MAGNETIC_FIELD: System.arraycopy(event.values, 0, mGeoMags, 0, 3); break; default: return; } if (mGravs != null && mGeoMags != null) { boolean bSuccess = SensorManager.getRotationMatrix(mRotationM, null, mGravs, mGeoMags); if (bSuccess) { SensorManager.getOrientation(mRotationM, mOrientation); } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }; private boolean openHardware() { sensorManager.registerListener(sensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(sensorEventListener, mMagneticField, SensorManager.SENSOR_DELAY_NORMAL); return true; } private void closeHardware() { sensorManager.unregisterListener(sensorEventListener); } @Override protected void onResume() { super.onResume(); openHardware(); } @Override protected void onPause() { super.onPause(); closeHardware(); } @Override protected void onStop() { closeHardware(); super.onStop(); } }

Ok, ce problème se produit parce que le capteur de champ magnétique renvoie toujours [0.0, 0.0, 0.0]. Comment puis-je faire en sorte que le capteur de champ magnétique renvoie autre chose?

+0

Log les mGravs et les valeurs de mGeoMags pour voir quelles sont les valeurs. –

+0

@HoanNguyen J'ai le même problème et j'ai aussi les vlaues dans ma question: http://stackoverflow.com/questions/33126522/why-does-getrotationmatrix-always-return-false-when-using-sensormanager-in- et – Loolooii

+0

Avez-vous réussi à le résoudre? – Loolooii

Répondre

Questions connexes