onSensorChanged()方法未被调用

10

今晚我在传感器方面遇到了很多麻烦,但似乎是因为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();
        }
    }

我在不同的论坛上看到了很多类似的代码,但除了这里和一些其他没有解决方案的主题,我还没有遇到过这样的问题…… 我需要在AndroidManifest中添加什么吗? 这是一个常见的问题吗? 有解决方案吗?

谢谢,Thomas (抱歉我的英语不好,我是法国人^^)

2个回答

10

到目前为止我还没有使用传感器,但是看起来你已经获取了 SensorManager 但是没有注册任何监听器以便于发生变化。只需要问一下自己 onSensorChanged 怎么会被调用呢?

查看关于传感器的 官方Android教程网站 上的示例,你可以在 onResume() 方法中看到这个:

@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}

同时不要忘记学习整个页面,它可以帮助你很多。

编辑:

我不得不复制粘贴您的源代码,因为我没有看到任何问题。基本上有两个问题:

  • 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);
}

其他方法是正确的


好吧,我忘记了代码的那部分,它在底部... 这并不能解决问题。 - Thomas
请更新您的问题,我非常确定它应该可以工作...同时尝试非空检查。如果它还是不起作用,我稍后会更深入地查看。 - VizGhar
完成!你如何称呼“非空检查”? - Thomas
我指的是那些在其他答案中提到@hoan-nguyen的内容。 - VizGhar
我该怎么做?抱歉,我是新手 :x - Thomas
点击数字下方我答案旁边的灰色复选标记,表示"赞"。 - VizGhar

0

你的设备可能没有 Sensor.TYPE_ROTATION_VECTOR。你应该检查 rotation_vector 是否为 null


我使用了一个列出设备上每个传感器并显示其数据的应用程序。旋转向量传感器运作良好。 - Thomas
同时注册TYPE_GYROSCOPE,看看是否现在被称为TYPE_ROTATION_VECTOR。 - Hoan Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接