首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用加速度计时,当没有传感器值被改变时,为什么onSensorChanged()方法会被定期调用?

问当使用加速度计时,当没有传感器值被改变时,为什么onSensorChanged()方法会被定期调用?
EN

Stack Overflow用户
提问于 2014-11-20 11:33:07
回答 2查看 1.1K关注 0票数 2

应用程序中的加速度计部分是如何工作的:

单击应用程序中的按钮后,目标是读取加速度计值并播放音频剪辑。

我已经将相关代码与应用程序隔离开来。

AlarmActivity.java

代码语言:javascript
复制
public class AlarmActivity extends Activity implements SensorEventListener {
    ...
    private SensorManager sensorManager;
    private Sensor mAccelerometer;
    private AudioPlayer mPlayer = new AudioPlayer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }

    @Override
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    public void onPause() {
        super.onPause();
        mPlayer.stop();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        mPlayer.stop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mPlayer.stop();
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        Log.d(TAG, "onSensor() called");

        class StartGuardingTask extends AsyncTask<Void, Void, Void> {
            @Override
            protected Void doInBackground(Void...params) {
                mPlayer.play(AlarmActivity.this);
                return null;
            }
        }

        if(mCurrentXVal != mOldXVal || mCurrentYVal != mOldYVal || mCurrentZVal != mOldZVal) {
            mOldXVal = mCurrentXVal;
            mOldYVal = mCurrentYVal;
            mOldZVal = mCurrentZVal;

            mXValue = (EditText)findViewById(R.id.editText1);
            mXValue.setText("x:" + mCurrentXVal);
            mYValue = (EditText)findViewById(R.id.editText2);
            mYValue.setText("y:" + mCurrentYVal);
            mZValue = (EditText)findViewById(R.id.editText3);
            mZValue.setText("z:" + mCurrentZVal);

            new StartGuardingTask().execute();
        }
    }
}

AudioPlayer.java

代码语言:javascript
复制
public class AudioPlayer {
    private MediaPlayer mPlayer;

    public void stop() {
        if(mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
    }

    public void play(Context c) {
        if(mPlayer == null) {
            mPlayer = MediaPlayer.create(c, R.raw.police_siren);

            mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    stop();
                }
            });
            mPlayer.start();
        }
    }

    public MediaPlayer getPlayer() {
        return mPlayer;
    }
}

即使设备是固定的,我也可以看到(使用logcat)方法被定期调用。

我读过另一个post,其中OP正面临类似的情况。

但this的文章建议,该方法将如预期的那样工作。

只有当该方法如公告的那样工作时,我才能消除onSensorChanged()方法中的条件。

因此,如果我的设备是静止的,没有传感器值被改变,那么为什么会发生这种情况呢?

EN

回答 2

Stack Overflow用户

发布于 2015-01-29 09:07:06

加速度计甚至能检测到最小的变化值。例如,你把手机放在桌子上,播放音乐。音乐的振动足以引起加速度计的许多重复变化,但数值很小。这就是为什么您必须在onSensorChanged()方法中添加一个条件,以便只通知值有足够大的变化。

票数 0
EN

Stack Overflow用户

发布于 2015-07-08 18:11:50

你怎么说传感器值没有改变?我想应该的。

因为重力的加速,你总是会被炒掉。根据android手机的方向,您将看到在x/y/z轴上报告了一些值。例如,当你站在地球上的一个地方静止不动时,加速度9.8米/s2正向下运动。android中的加速度计也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27038558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档