onSensorChanged() 未在 Android 上触发(nVidia Shield 平板电脑)
onSensorChanged() not fired on Android (nVidia Shield Tablet)
我正在尝试为 nVidia shield 创建一个增强现实应用程序。
我在另一台 Android 设备上试用了我的应用程序,它运行正常。
不幸的是,在盾牌上,没有触发 onSensorChanged 事件。
这是我的代码:
_sensorEventListener = new SensorEventListener()
{
public void onSensorChanged(SensorEvent event) {
AndroidAttitude.this.processSensorEvent(event);
}
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
};
Thread sensorThread = new Thread(new Runnable()
{
public void run() {
Looper.prepare();
_sensorLooper = Looper.myLooper();
Handler handler = new Handler();
_sensorManager = (SensorManager)_context.getSystemService("sensor");
Sensor sensor = _sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
_sensorManager.registerListener(_sensorEventListener, sensor, 0, _sensorManager.SENSOR_DELAY_GAME);
Looper.loop();
}
});
sensorThread.start();
这是我将值转换为旋转矩阵的地方:
private synchronized void processSensorEvent(SensorEvent event)
{
float[] rotationVector = { -event.values[1], event.values[0], event.values[2] };
float[] quaternion = new float[4];
float[] rotationMatrix = new float[16];
_sensorManager.getQuaternionFromVector(quaternion, rotationVector);
_sensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector);
}
知道为什么它不起作用吗?
好的,如果你必须使用 TYPE_ROTATION_VECTOR
,从 SENSOR_DELAY_GAME
更改为 SENSOR_DELAY_NORMAL
Sensor sensor = _sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
_sensorManager.registerListener(_sensorEventListener, sensor, 0, _sensorManager.SENSOR_DELAY_NORMAL)
你试过 SENSOR_DELAY_FASTEST 了吗?
由于 registerListener
如果您传入 null sensor
不会抛出异常,您应该检查 sensor
是否为 null
。您的设备似乎没有 Sensor.TYPE_ROTATION_VECTOR
所以..我刚刚发现问题出在哪里。
我的平板电脑的磁性盖弄乱了磁力计,导致游戏旋转矢量传感器和磁场传感器不发送数据。
我不敢相信我花了好几个小时挠头来解决这个问题...
我正在尝试为 nVidia shield 创建一个增强现实应用程序。 我在另一台 Android 设备上试用了我的应用程序,它运行正常。 不幸的是,在盾牌上,没有触发 onSensorChanged 事件。
这是我的代码:
_sensorEventListener = new SensorEventListener()
{
public void onSensorChanged(SensorEvent event) {
AndroidAttitude.this.processSensorEvent(event);
}
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
};
Thread sensorThread = new Thread(new Runnable()
{
public void run() {
Looper.prepare();
_sensorLooper = Looper.myLooper();
Handler handler = new Handler();
_sensorManager = (SensorManager)_context.getSystemService("sensor");
Sensor sensor = _sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
_sensorManager.registerListener(_sensorEventListener, sensor, 0, _sensorManager.SENSOR_DELAY_GAME);
Looper.loop();
}
});
sensorThread.start();
这是我将值转换为旋转矩阵的地方:
private synchronized void processSensorEvent(SensorEvent event)
{
float[] rotationVector = { -event.values[1], event.values[0], event.values[2] };
float[] quaternion = new float[4];
float[] rotationMatrix = new float[16];
_sensorManager.getQuaternionFromVector(quaternion, rotationVector);
_sensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector);
}
知道为什么它不起作用吗?
好的,如果你必须使用 TYPE_ROTATION_VECTOR
,从 SENSOR_DELAY_GAME
更改为 SENSOR_DELAY_NORMAL
Sensor sensor = _sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
_sensorManager.registerListener(_sensorEventListener, sensor, 0, _sensorManager.SENSOR_DELAY_NORMAL)
你试过 SENSOR_DELAY_FASTEST 了吗?
由于 registerListener
如果您传入 null sensor
不会抛出异常,您应该检查 sensor
是否为 null
。您的设备似乎没有 Sensor.TYPE_ROTATION_VECTOR
所以..我刚刚发现问题出在哪里。 我的平板电脑的磁性盖弄乱了磁力计,导致游戏旋转矢量传感器和磁场传感器不发送数据。 我不敢相信我花了好几个小时挠头来解决这个问题...