【问题标题】:Why is my variable wrong at the begin of onSensorChanged() call?为什么我的变量在 onSensorChanged() 调用开始时出错?
【发布时间】: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


【解决方案1】:

设备旋转重新创建活动。解决方案:将android:screenOrientation="portrait" 添加到清单中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多