Android 如何在人员靠近接近传感器时播放重复音频,并在其离开时停止播放

Android 如何在人员靠近接近传感器时播放重复音频,并在其离开时停止播放,android,audio,proximitysensor,Android,Audio,Proximitysensor,我想在我的手靠近接近传感器时播放重复音频,并在手离开传感器时停止音频。这是我写的代码。。当我靠近接近传感器时,音频会播放,但当我的手移开时,音频不会停止。有什么建议吗?提前谢谢 public class MainActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor proxy; TextView tv; MediaPlayer

我想在我的手靠近接近传感器时播放重复音频,并在手离开传感器时停止音频。这是我写的代码。。当我靠近接近传感器时,音频会播放,但当我的手移开时,音频不会停止。有什么建议吗?提前谢谢

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) {

}
}
公共类MainActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
专用传感器代理;
文本视图电视;
MediaPlayer mp;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager=(sensorManager)getSystemService(传感器服务);
proxy=sensorManager.getDefaultSensor(Sensor.TYPE_接近度);
tv=(TextView)findviewbyd(R.id.tv);
//tv.setText(“最大范围=“+proxy.getMaximumRange()+proxy.getName());
}
@凌驾
受保护的void onPause(){
super.onPause();
sensorManager.UnregistereListener(此);
}
@凌驾
受保护的void onResume(){
super.onResume();
sensorManager.registerListener(此、代理、sensorManager.SENSOR\u延迟\u正常);
}
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u){
mp=MediaPlayer.create(这个,R.raw.alarm);
if(event.values[0]
每次调用onSensorChanged(传感器事件)时,您的代码都会初始化媒体播放器。 当您试图调用stop()方法时,它将在您刚刚创建的新对象中被调用,而上一个对象已经在内存中运行报警,因此它不会停止。 根据文档,如果从未调用start(),则stop()无效。理想情况下,它应该引发异常,但显然没有效果。 我已经修改了你的代码,我建议它应该可以工作(可能)

公共类MainActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
专用传感器代理;
文本视图电视;
静态最终MediaPlayer mp=MediaPlayer.create(此为R.raw.alarm);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager=(sensorManager)getSystemService(传感器服务);
proxy=sensorManager.getDefaultSensor(Sensor.TYPE_接近度);
tv=(TextView)findviewbyd(R.id.tv);
/**
*在准备好的侦听器上设置
*/
mp.setOnPreparedListener(新的MediaPlayer.OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
mp.start();
mp.setLooping(真);
}
});
}
@凌驾
受保护的void onPause(){
super.onPause();
sensorManager.UnregistereListener(此);
}
@凌驾
受保护的void onResume(){
super.onResume();
sensorManager.registerListener(此、代理、sensorManager.SENSOR\u延迟\u正常);
}
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u){
if(event.values[0]

}

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

公共类MainActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
专用传感器代理;
文本视图电视;
静态最终MediaPlayer mp=MediaPlayer.create(此为R.raw.alarm);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager=(sensorManager)getSystemService(传感器服务);
proxy=sensorManager.getDefaultSensor(Sensor.TYPE_接近度);
tv=(TextView)findviewbyd(R.id.tv);
/**
*在准备好的侦听器上设置
*/
mp.setOnPreparedListener(新的MediaPlayer.OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
mp.start();
mp.setLooping(真);
}
});
}
@凌驾
受保护的void onPause(){
super.onPause();
sensorManager.UnregistereListener(此);
}
@凌驾
受保护的void onResume(){
super.onResume();
sensorManager.registerListener(此、代理、sensorManager.SENSOR\u延迟\u正常);
}
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u){
if(event.values[0]

}

我使用exoplayer播放音频文件

您必须添加此库:

compile 'com.google.android.exoplayer:exoplayer:r2.5.4'
并添加读取权限:

"android.permission.READ_EXTERNAL_STORAGE"
代码:

公共类MainActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
专用传感器;
公共sta
"android.permission.READ_EXTERNAL_STORAGE"
public class MainActivity extends Activity implements SensorEventListener {

private SensorManager sensorManager;
private Sensor sensor;
public static final int MY_PERMISSIONS_REQUEST_READ = 1 ;

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

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

   initExoPlayer();


}

public void  initExoPlayer(){
    DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(this , null , DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF);
    DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector();
    exoPlayer = ExoPlayerFactory.newSimpleInstance(defaultRenderersFactory , defaultTrackSelector) ;
    String  agent = Util.getUserAgent(this, "exoplayer") ;
    ExtractorMediaSource extractorMediaSource  = new ExtractorMediaSource(your_audio_uri , new DefaultDataSourceFactory(this , agent)
            , new DefaultExtractorsFactory() , null , null) ;

    exoPlayer.prepare(extractorMediaSource);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    initExoPlayer();

            }
            return;
        }

        // other 'switch' lines to check for other
        // permissions this app might request
    }

}

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
        if (event.values[0] < sensor.getMaximumRange()) {
            exoPlayer.setAudioStreamType(C.STREAM_TYPE_VOICE_CALL);
            exoPlayer.setPlayWhenReady(true);
        } else {
            exoPlayer.setPlayWhenReady(false);

        }

    }
}

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

@Override
protected void onResume() {
    super.onResume();

    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}




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

}
public  void requestPermissions() {
    if (Build.VERSION.SDK_INT >= 23) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ);

    }

}
}