* 切换扬声器播放声音 or 听筒播放
* 1. 距离感应器:继承SensorEventListener这个监听,重写onSensorChanged方法
* 2. 检测耳机插入和拔出:HeadsetPlugReceiver监听广播AudioManager.ACTION_AUDIO_BECOMING_NOISY和"android.intent.action.HEADSET_PLUG",
* 3. 切换扬声器模式和听筒模式 需要增加权限: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
下面是核心代码:
1. 距离感应器监听方法:
- /*
- * 实现SensorEventListener需要实现的两个方法。
- */
- @Override
- public void onSensorChanged(SensorEvent event) {
- // TODO Auto-generated method stub
- f_proximiny = event.values[0];
-
- if (f_proximiny >= mProximiny.getMaximumRange()) {
- Log.i("==================>onSensorChanged", "MODE_NORMAL");
- audioManager.setMode(AudioManager.MODE_NORMAL);
- } else {
- Log.i("==================>onSensorChanged", "MODE_IN_CALL");
- audioManager.setMode(AudioManager.MODE_IN_CALL);
- }
- }
2. 耳机插拔监听:
2.1 广播注册:
- myNoisyAudioStreamReceiver = new HeadsetPlugReceiver();
- IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
- intentFilter.addAction("android.intent.action.HEADSET_PLUG");
- registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
2.2 广播监听:
- public class HeadsetPlugReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.i("NoisyAudioStreamReceiver=====================>", "change mode");
- if (intent.hasExtra("state")){
- if (intent.getIntExtra("state", 0) == 0){
- Log.i("NoisyAudioStreamReceiver=====================>headset not connected", "change mode1");
- audioManager.setMode(AudioManager.MODE_NORMAL);
- }
- else if (intent.getIntExtra("state", 0) == 1){
- Log.i("NoisyAudioStreamReceiver=====================>headset connected", "change mode3");
- audioManager.setMode(AudioManager.MODE_IN_CALL);
- }
- }
- }
- }
2.3 广播注销:
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unregisterReceiver(myNoisyAudioStreamReceiver);
- }
Demo下载:
Android 距离感应控制Audio输出通道
|