应用程序中的加速度计部分是如何工作的:
单击应用程序中的按钮后,目标是读取加速度计值并播放音频剪辑。
我已经将相关代码与应用程序隔离开来。
AlarmActivity.java
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
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()方法中的条件。
因此,如果我的设备是静止的,没有传感器值被改变,那么为什么会发生这种情况呢?
发布于 2015-01-29 09:07:06
加速度计甚至能检测到最小的变化值。例如,你把手机放在桌子上,播放音乐。音乐的振动足以引起加速度计的许多重复变化,但数值很小。这就是为什么您必须在onSensorChanged()方法中添加一个条件,以便只通知值有足够大的变化。
发布于 2015-07-08 18:11:50
你怎么说传感器值没有改变?我想应该的。
因为重力的加速,你总是会被炒掉。根据android手机的方向,您将看到在x/y/z轴上报告了一些值。例如,当你站在地球上的一个地方静止不动时,加速度9.8米/s2正向下运动。android中的加速度计也是如此。
https://stackoverflow.com/questions/27038558
复制相似问题