【发布时间】:2022-06-23 19:54:58
【问题描述】:
我有这个 android 活动,antiLoopMutex 变量的目标是防止连续播放声音。不幸的是,如果声明 sensorEvent.values[0] > 6.0 开始始终为真,那么 antiLoopMutex 将在前 2 次 onSensorChanged() 调用中等于 false,而不是 1 次为假然后始终为真。
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sensorManager;
private Sensor sensor;
private MediaPlayer mp;
private boolean antiLoopMutex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
mp = MediaPlayer.create(this, R.raw.pseudo_perc);
}
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
System.out.println(Arrays.toString(sensorEvent.values));
if (sensorEvent.values[0] > 6.0) {
if (!mp.isPlaying() && !antiLoopMutex) {
System.out.println("[1] Mutex: "+antiLoopMutex);
antiLoopMutex = true;
mp.start();
System.out.println("[2] Mutex: "+antiLoopMutex);
mp.setOnCompletionListener(mp -> {
mp.pause();
mp.seekTo(0);
});
}
} else {
System.out.println("[3]");
antiLoopMutex = false;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
所以当前的输出是:
I/System.out: [0.009788696, 9.753927, 1.0153474]
I/System.out: [3]
I/System.out: [3.0661938, 9.168555, 1.6450276]
I/System.out: [3]
I/System.out: [9.268236, 0.9579816, 3.0581598]
I/System.out: [1] Mutex: false
I/System.out: [2] Mutex: true
I/System.out: [9.594612, 0.60149497, 1.9369502]
I/System.out: [9.562999, -0.49292007, 2.1157124]
I/System.out: [1] Mutex: false
I/System.out: [2] Mutex: true
I/System.out: [9.545794, -0.5383557, 2.1813302]
I/System.out: [9.534273, -0.5199543, 2.235509]
如您所见,[1] 被打印了 2 次,而 [3] 没有被打印,但 [2](在anitLoopMutex = true 之后)之间。为什么 [1] 只打印了 1 次,如何解决?
【问题讨论】:
-
您在测试期间是否在旋转设备?
-
是的,控制台输出显示重力矢量
-
您的活动可能会在设备旋转时重新创建,这会将您的标志重置为 false - 添加一些生命周期调试以进行演示。
-
谢谢,你是对的!将 android:screenOrientation="portrait" 添加到清单声音中后,正在播放 1 次。
标签: java android boolean android-sensors android-gravity