【问题标题】:onSensorChanged() is not called未调用 onSensorChanged()
【发布时间】:2015-01-26 22:13:33
【问题描述】:

今晚我在使用传感器时遇到了很多麻烦,但似乎是因为未调用 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 中添加一些东西吗? 这是一个普遍的问题吗? 有解决办法吗?

谢谢, 托马斯 (对不起我的英语不好,我是法国人^^)

【问题讨论】:

    标签: java android android-sensors


    【解决方案1】:

    到目前为止,我还没有使用 Sensors,但您似乎已经获得了 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);
    }
    

    其他方法正确

    【讨论】:

    • 好吧,我忘记了我的那部分代码,它在底部......它没有解决问题
    • 那么请更新您的问题,我很确定它必须工作......也尝试非空检查。如果它不起作用,我稍后会更深入地查看
    • 完成!你怎么称呼“非空检查”?
    • 我的意思是那些在其他答案中提到@hoan-nguyen的人
    • 我该怎么做?对不起,我是新人:x
    【解决方案2】:

    您的设备可能没有Sensor.TYPE_ROTATION_VECTOR。您应该检查rotation_vector 以获取null

    【讨论】:

    • 我使用了一个应用程序,列出设备上的每个传感器并显示它们的数据。并且旋转矢量传感器运行良好
    • 同时注册 TYPE_GYROSCOPE,看看现在是否调用了 TYPE_ROTATION_VECTOR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多