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哈哈!是的,我后来意识到我的错误,把它放在网上太尴尬了:)