1

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

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

}
}
4

2 回答 2

0

我使用 exoplayer 播放音频文件。

您必须添加此库:

compile 'com.google.android.exoplayer:exoplayer:r2.5.4'

并添加读取权限:

"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);

    }

}
}
于 2018-02-17T07:07:09.813 回答
0

每次调用 onSensorChanged(SensorEvent event) 时,您的代码都会初始化媒体播放器。当您尝试调用 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) {

}

}

于 2017-06-21T16:46:24.333 回答