2013-03-04 59 views
2

我嘗試在我的Android模擬器上獲取方向SensorManager.getOrientation。在此之前,我使用SensorManager.getRotationMatrix來獲得旋轉矩陣,但這總是返回false。 這裏是我的代碼活動: SensorManager.getRotationMatrix在Android模擬器上始終返回false


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(); } }

好吧,這個問題的發生是因爲磁場傳感器總是返回[0.0,0.0,0.0]。 如何讓磁場傳感器返回其他東西?

+0

日誌中mGravs和mGeoMags值,看看有什麼是價值觀。 – 2013-03-04 19:00:04

+0

@HoanNguyen我有同樣的問題,我也在我的問題的價值:http://stackoverflow.com/questions/33126522/why-does-getrotationmatrix-always-return-false-when-using-sensormanager-in-和 – Loolooii 2015-10-14 14:10:33

+0

你是否設法解決它? – Loolooii 2015-10-14 14:11:18

回答