onSensorChanged() 未被调用
onSensorChanged() is not called
今晚我在传感器方面遇到了很多麻烦,但似乎是因为没有调用 onSensorChanged()。很抱歉最终出现重复问题,但我没有看到任何解决方案。
这是我的代码:
public SensorManager manager;
public Sensor rotation_vector;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
rotation_vector = manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
}
@Override
public void onSensorChanged(SensorEvent event) {
int xValue = (int) event.values[0];
int yValue = (int) event.values[1];
int zValue = (int) event.values[2];
Toast.makeText(getApplicationContext(),"this doesn't appear...",Toast.LENGTH_LONG);
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//TODO: we'll see later about it
}
public void onPause() {
/*Et on le dés-enregistre quand on sort de l'activité, pour économiser de la batterie*/
super.onPause();
manager.unregisterListener(this);
}
@Override
protected void onResume() {
/*On enregistre le sensor quand l'utilisateur revient sur l'activité*/
super.onResume();
manager.registerListener(this, rotation_vector, SensorManager.SENSOR_DELAY_NORMAL);
if (null != rotation_vector) {
} else {
Toast.makeText(getApplicationContext(),
"There is no gyroscope on your device",
Toast.LENGTH_LONG).show();
}
}
我在不同的论坛上看到了很多类似的代码,但是除了 there 和其他一些没有解决方案的主题之外,我还没有看到这样的问题......
我必须在 AndroidManifest 中添加一些东西吗?
这是一个常见问题吗?
有解决办法吗?
谢谢,
托马斯
(抱歉我英语不好,我是法国人^^)
到目前为止我还没有使用传感器,但看起来您已经获得了 SensorManager
但没有为应该发生的变化注册任何侦听器。问问自己怎么可能被称为 onSensorChanged
?
查看 official android tutorial site 上关于传感器的示例,您可以在 onResume()
方法中看到:
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
另外不要忘记研究整个页面它可以帮助你很多。
编辑:
我不得不复制粘贴你的源代码,因为我没有发现任何问题。基本上有2个:
- Toast 没有显示,因为您没有告诉他...
Toast.show()
将显示它。但是您宁愿使用 Log
将更改输出到控制台。由你决定
- 不要在
onSensorChanged()
方法中将 float 重新键入 int,因为所有值都是 0 或(1/-1,如果幸运的话)
结果如下:
@Override
public void onSensorChanged(SensorEvent event) {
float xValue = event.values[0];
float yValue = event.values[1];
float zValue = event.values[2];
Log.d(LOG_TAG, "x:"+xValue +";y:"+yValue+";z:"+zValue);
}
其他方法都正确
您的设备可能没有Sensor.TYPE_ROTATION_VECTOR
。您应该检查 rotation_vector
是否有 null
。
今晚我在传感器方面遇到了很多麻烦,但似乎是因为没有调用 onSensorChanged()。很抱歉最终出现重复问题,但我没有看到任何解决方案。 这是我的代码:
public SensorManager manager;
public Sensor rotation_vector;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
rotation_vector = manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
}
@Override
public void onSensorChanged(SensorEvent event) {
int xValue = (int) event.values[0];
int yValue = (int) event.values[1];
int zValue = (int) event.values[2];
Toast.makeText(getApplicationContext(),"this doesn't appear...",Toast.LENGTH_LONG);
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//TODO: we'll see later about it
}
public void onPause() {
/*Et on le dés-enregistre quand on sort de l'activité, pour économiser de la batterie*/
super.onPause();
manager.unregisterListener(this);
}
@Override
protected void onResume() {
/*On enregistre le sensor quand l'utilisateur revient sur l'activité*/
super.onResume();
manager.registerListener(this, rotation_vector, SensorManager.SENSOR_DELAY_NORMAL);
if (null != rotation_vector) {
} else {
Toast.makeText(getApplicationContext(),
"There is no gyroscope on your device",
Toast.LENGTH_LONG).show();
}
}
我在不同的论坛上看到了很多类似的代码,但是除了 there 和其他一些没有解决方案的主题之外,我还没有看到这样的问题...... 我必须在 AndroidManifest 中添加一些东西吗? 这是一个常见问题吗? 有解决办法吗?
谢谢, 托马斯 (抱歉我英语不好,我是法国人^^)
到目前为止我还没有使用传感器,但看起来您已经获得了 SensorManager
但没有为应该发生的变化注册任何侦听器。问问自己怎么可能被称为 onSensorChanged
?
查看 official android tutorial site 上关于传感器的示例,您可以在 onResume()
方法中看到:
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
另外不要忘记研究整个页面它可以帮助你很多。
编辑:
我不得不复制粘贴你的源代码,因为我没有发现任何问题。基本上有2个:
- Toast 没有显示,因为您没有告诉他...
Toast.show()
将显示它。但是您宁愿使用Log
将更改输出到控制台。由你决定 - 不要在
onSensorChanged()
方法中将 float 重新键入 int,因为所有值都是 0 或(1/-1,如果幸运的话)
结果如下:
@Override
public void onSensorChanged(SensorEvent event) {
float xValue = event.values[0];
float yValue = event.values[1];
float zValue = event.values[2];
Log.d(LOG_TAG, "x:"+xValue +";y:"+yValue+";z:"+zValue);
}
其他方法都正确
您的设备可能没有Sensor.TYPE_ROTATION_VECTOR
。您应该检查 rotation_vector
是否有 null
。