下面列出了android.media.AudioManager#MODE_IN_COMMUNICATION 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 免提,切换外放和听筒
*/
private void switchAudioMute() {
int result = audioManager.ting();
if(result == AudioManager.MODE_NORMAL) {
if(videoEnable) {
rtcMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_open), null, null);
} else {
audioMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_open), null, null);
}
} else if(result == AudioManager.MODE_IN_COMMUNICATION) {
if(videoEnable) {
rtcMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_close), null, null);
} else {
audioMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_close), null, null);
}
}
}
@Override
public void run() {
final int mode = audioManager.getMode();
if (mode == AudioManager.MODE_RINGTONE) {
Logging.d(TAG, "STREAM_RING stream volume: "
+ audioManager.getStreamVolume(AudioManager.STREAM_RING) + " (max="
+ maxRingVolume + ")");
} else if (mode == AudioManager.MODE_IN_COMMUNICATION) {
Logging.d(TAG, "VOICE_CALL stream volume: "
+ audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) + " (max="
+ maxVoiceCallVolume + ")");
}
}
@Override
public void run() {
final int mode = audioManager.getMode();
if (mode == AudioManager.MODE_RINGTONE) {
Logging.d(TAG,
"STREAM_RING stream volume: " + audioManager.getStreamVolume(AudioManager.STREAM_RING)
+ " (max=" + maxRingVolume + ")");
} else if (mode == AudioManager.MODE_IN_COMMUNICATION) {
Logging.d(TAG,
"VOICE_CALL stream volume: "
+ audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL)
+ " (max=" + maxVoiceCallVolume + ")");
}
}
private void playAudio() {
switch (audioManager.getRingMode()) {
case AudioManager.RINGER_MODE_NORMAL://响铃
case AudioManager.MODE_IN_COMMUNICATION://音频通话
MediaUtils.playRtcSound(RtcActivity.this, R.raw.atom_rtc_video_prompt);
if(!isCaller) {
audioManager.changeToEarpieceMode();
} else {
audioManager.changeToSpeakerMode();
}
// MediaUtils.loadRtcSound(RtcActivity.this, R.raw.atom_rtc_video_prompt);
// MediaUtils.playRtcTone(RtcActivity.this);
break;
case AudioManager.RINGER_MODE_SILENT://静音
case AudioManager.RINGER_MODE_VIBRATE://震动
if(!isCaller) {
MediaUtils.playRtcSound(RtcActivity.this, R.raw.atom_rtc_video_prompt);
audioManager.changeToEarpieceMode();
} else {
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
//按照指定的模式去震动。
// vibrator.vibrate(1000);
//数组参数意义:第一个参数为等待指定时间后开始震动,震动时间为第二个参数。后边的参数依次为等待震动和震动的时间
//第二个参数为重复次数,-1为不重复,0为一直震动
vibrator.vibrate( new long[]{1000,1000},0);
}
break;
}
}
protected void shownVideo() {
//localRender.setVisibility(View.VISIBLE);
//remoteRender.setVisibility(View.VISIBLE);
//vsv.setVisibility(View.VISIBLE);
videoLayout.setVisibility(View.VISIBLE);
audioLayout.setVisibility(View.GONE);
if(audioManager == null) return;
if(audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
rtcMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_close), null, null);
} else {
rtcMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_open), null, null);
}
}
protected void showAudio() {
videoLayout.setVisibility(View.GONE);
audioLayout.setVisibility(View.VISIBLE);
if(audioManager == null) return;
if(audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
audioMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_close), null, null);
} else {
audioMute.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.drawable.pub_imsdk_rtc_audio_open), null, null);
}
}
public int ting()
{
if(getSelectedAudioDevice() == AudioDevice.SPEAKER_PHONE)
{
if(audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION)
{
return changeToSpeakerMode();
}
else if(audioManager.getMode() == AudioManager.MODE_NORMAL) {
return changeToEarpieceMode();
}
}
return -1;
}
/**
* 听筒模式
* @return
*/
public int changeToEarpieceMode() {
audioManager.setSpeakerphoneOn(false);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
((Activity) apprtcContext).setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
return AudioManager.MODE_IN_COMMUNICATION;
}
private void startBluetoothSco() {
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (am != null) {
if (am.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
am.setSpeakerphoneOn(false);
am.startBluetoothSco();
}
}
public void setAudioManagerInCallMode() {
if (mAudioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
Log.w("[AudioManager] already in MODE_IN_COMMUNICATION, skipping...");
return;
}
Log.d("[AudioManager] Mode: MODE_IN_COMMUNICATION");
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// assume that the user cancels the call if it is ringing
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (!canCallBeResumed()) {
if (null != mCall) {
mCall.hangup("");
}
} else {
saveCallView();
}
} else if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) || (keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
// this is a trick to reduce the ring volume :
// when the call is ringing, the AudioManager.Mode switch to MODE_IN_COMMUNICATION
// so the volume is the next call one whereas the user expects to reduce the ring volume.
if ((null != mCall) && mCall.getCallState().equals(IMXCall.CALL_STATE_RINGING)) {
AudioManager audioManager = (AudioManager) CallViewActivity.this.getSystemService(Context.AUDIO_SERVICE);
// IMXChrome call issue
if (audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
int musicVol = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) * audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) / audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVol, 0);
}
}
}
return super.onKeyDown(keyCode, event);
}
private void setAudioManagerInCallMode() {
if (mAudioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION) {
Log.w("[Audio Manager] already in MODE_IN_COMMUNICATION, skipping...");
return;
}
Log.d("[Audio Manager] Mode: MODE_IN_COMMUNICATION");
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
public synchronized void routeAudioToBluetooth() {
if (!isBluetoothHeadsetConnected()) {
Log.w("[Audio Manager] [Bluetooth] No headset connected");
return;
}
if (mAudioManager.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
Log.w(
"[Audio Manager] [Bluetooth] Changing audio mode to MODE_IN_COMMUNICATION and requesting STREAM_VOICE_CALL focus");
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
requestAudioFocus(STREAM_VOICE_CALL);
}
changeBluetoothSco(true);
}
private boolean isCommunicationModeEnabled() {
return (audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION);
}
@Override
public void onNotifyHeadsetState(boolean connected, int type) {
try {
if (connected) {
HeadsetPlugReceiverState = true;
if (type == 0) {
startBluetoothSco();
}
if (null != btnMuteSpeaker) {
btnMuteSpeaker.setBackgroundResource(R.drawable.img_capture_gray);
btnMuteSpeaker.setSelected(false);
btnMuteSpeaker.setEnabled(false);
btnMuteSpeaker.setClickable(false);
audioManager.onToggleSpeaker(false);
}
} else {
if (type == 1 && BluetoothUtil.hasBluetoothA2dpConnected()) {
return;
}
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (am != null) {
if (am.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
if (type == 0) {
am.stopBluetoothSco();
am.setBluetoothScoOn(false);
am.setSpeakerphoneOn(!muteSpeaker);
} else {
RCRTCEngine.getInstance().enableSpeaker(!this.muteSpeaker);
}
audioManager.onToggleSpeaker(!muteSpeaker);
}
if (null != btnMuteSpeaker) {
btnMuteSpeaker.setBackgroundResource(R.drawable.selector_checkbox_capture);
btnMuteSpeaker.setSelected(false);
btnMuteSpeaker.setEnabled(true);
btnMuteSpeaker.setClickable(true);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean isUserInCommunicationCall(Context context) {
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
return manager.getMode() == AudioManager.MODE_IN_CALL || manager.getMode() == AudioManager.MODE_IN_COMMUNICATION;
}