Android 距离感应器和耳机状态监测(控制Audio输出通道切换)

 * 切换扬声器播放声音 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输出通道


你可能感兴趣的:(android,audio)