android - SensorManager.getRotationMatrix 在 Android 模拟器上始终返回 false

标签 android android-sensors

我尝试通过 SensorManager.getOrientation 在 Android 模拟器上获取方向。在此之前,我使用 SensorManager.getRotationMatrix 来获取旋转矩阵,但这总是返回 false。 这是我的 Activity 代码:


public class MainActivity extends Activity implements SurfaceHolder.Callback,  View.OnClickListener{<p></p>

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]。 我怎样才能让磁场传感器返回其他东西?

最佳答案

我也遇到了同样的问题。一切都变得错误

这个答案对我有帮助:https://stackoverflow.com/a/14224122/1549127

关于android - SensorManager.getRotationMatrix 在 Android 模拟器上始终返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15208597/

相关文章:

java - 从 PhoneGap 访问 Urban Airship Constant

android - 如何在 droid 中的方法结束之前刷新屏幕?

java - Nexus 6P 上硬件传感器的 Android 采样率变化

android - 在android中检测抖动

java - Android 动态标题栏

javascript - UIwebview 中的 CSS 注入(inject)

下面有广告的 Android GridView

android - Google map 上的蓝色闪光灯 (Arc)

java - 如何使用手机的加速度传感器计算振动频率(Hz或G或等效)?

android - 使用加速度计机器人的运动方向不起作用