SensorManager.getRotationMatrix在Android Emulator上始终返回false

SensorManager.getRotationMatrix在Android Emulator上始终返回false,android,android-sensors,Android,Android Sensors,我试图通过SensorManager.getOrientation在我的Android模拟器上获得方向信息。在此之前,我使用SensorManager.getRotationMatrix获取旋转矩阵,但它总是返回false。 以下是我的活动代码: public class MainActivity extends Activity implements SurfaceHolder.Callback, View.OnClickListener{ public final static Str

我试图通过
SensorManager.getOrientation
在我的Android模拟器上获得方向信息。在此之前,我使用
SensorManager.getRotationMatrix
获取旋转矩阵,但它总是返回
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(); } }

公共类MainActivity扩展活动实现SurfaceHolder.Callback、View.OnClickListener{

公共最终静态字符串DEBUG_TAG=“MainActivity”; 私人传感器管理器传感器管理器; 私人SurfaceView预览; 私人浮动[]经理; 私人浮动[]MGEOMAG; 私人浮动[]mRotationM; 私人托管; 专用传感器mAccelerometer; 磁场专用传感器; @凌驾 创建时受保护的void(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_全屏); requestWindowFeature(窗口。功能\u无\u标题); setContentView(R.layout.activity_main); 预览=(SurfaceView)findViewById(R.id.SurfaceView W1); sensorManager=(sensorManager)getSystemService(传感器服务); mAccelerometer=sensorManager.getDefaultSensor(传感器类型\加速计); mmamagneticField=sensorManager.getDefaultSensor(传感器类型\u磁场); mGravs=新浮动[3]; mGeoMags=新浮点数[3]; mRotationM=新浮动[16]; mOrientation=新浮点数[3]; List sensorList=sensorManager.getSensorList(Sensor.TYPE_ALL); 对于(int nI=0;nI
好的,出现此问题是因为磁场传感器总是返回[0.0,0.0,0.0]。
如何使磁场传感器返回其他东西?

我也有同样的问题。一切都是假的


这个答案对我很有帮助:

记录mGravs和mGeoMags的值,看看值是什么。@HoanNguyen我有同样的问题,我的问题中也有问题:你解决了吗?@Loolooii你删除了帖子,但这只是你代码中的局部变量范围错误。@HoanNguyen哈哈!是的,我后来意识到我的错误,把它放在网上太尴尬了:)