android - 当一个人靠近距离传感器时如何播放重复的音频,而当他离开时如何停止

标签 android audio proximitysensor

当我的手靠近接近传感器时,我想播放一个重复的音频,而当手从传感器移开时,我要停止音频。这是我编写的代码。当我靠近接近传感器时,音频会播放,但是当我的手移开时,音频不会停止。有什么建议么?提前致谢。

public class MainActivity extends Activity implements SensorEventListener {

private SensorManager sensorManager;
private Sensor proxy;
TextView tv;
MediaPlayer mp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    proxy = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    tv = (TextView) findViewById(R.id.tv);
    //tv.setText("Maximum range = " + proxy.getMaximumRange() + proxy.getName());

}

@Override
protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
}

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

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_PROXIMITY){
        mp = MediaPlayer.create(this,R.raw.alarm);
        if(event.values[0] < proxy.getMaximumRange()){
            mp.start();
            mp.setLooping(true);
        }
        else{
            mp.stop();
        }
        //tv.setText("SEnsor NOT activated");
        }
    }


@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
}

最佳答案

每当调用onSensorChanged(SensorEvent事件)时,您的代码都会初始化媒体播放器。
当您尝试调用stop()方法时,该方法正在刚刚创建的新对象中被调用,而先前的对象已经在内存中运行警报的某个位置,因此不会停止。
根据文档,如果尚未调用start(),stop()无效,理想情况下,它应该引发异常,但显然没有任何作用。
我修改了您的代码,我建议该代码应该(可能)正常工作。

public class MainActivity extends Activity implements SensorEventListener {

private SensorManager sensorManager;
private Sensor proxy;
TextView tv;
static final MediaPlayer mp= MediaPlayer.create(this,R.raw.alarm);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    proxy = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    tv = (TextView) findViewById(R.id.tv);
    /**
     * set on prepared listener
     */


 mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                   mp.start();
                   mp.setLooping(true);

                }
            });





}

@Override
protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
}

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

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_PROXIMITY){
       if(event.values[0] < proxy.getMaximumRange()){
            mp.prepareAsync();
        }
        else{
            mp.stop();
        }

    }
}


@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}

关于android - 当一个人靠近距离传感器时如何播放重复的音频,而当他离开时如何停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44677616/

相关文章:

android - 如何检测 Android 屏幕上的手压

android - 指南针在 android 中不起作用

android - Parse 服务器退役后,Parse4cn1 还能工作吗?

Android ACTION_SEND Intent 不填充主题或正文

c# - 如何使用 ffmpeg 将常规 WAV 文件转换为 4 位 WAV 文件?

javascript - 如何在 Web Audio API 中为 OscillatorNode 设置相位偏移?

java - Android Studio 中缺少编译器选项 >= 0.8.2

android - 如何使用 Canvas 重绘选项菜单图标

javascript - 将Youtube音频转换为数字

android:接近传感器问题