package com.fanxin.app.activity; import com.easemob.chat.EMCallStateChangeListener; import com.easemob.chat.EMChatManager; import com.easemob.chat.EMMessage; import com.easemob.chat.TextMessageBody; import com.fanxin.app.Constant; import com.fanxin.app.R; import android.content.Context; import android.media.AudioManager; import android.media.Ringtone; import android.media.SoundPool; import android.os.Bundle; public class CallActivity extends BaseActivity { protected boolean isInComingCall; protected String username; protected CallingState callingState = CallingState.CANCED; protected String callDruationText; protected String msgid; protected AudioManager audioManager; protected SoundPool soundPool; protected Ringtone ringtone; protected int outgoing; protected EMCallStateChangeListener callStateListener; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); } @Override protected void onDestroy() { super.onDestroy(); if (soundPool != null) soundPool.release(); if (ringtone != null && ringtone.isPlaying()) ringtone.stop(); audioManager.setMode(AudioManager.MODE_NORMAL); audioManager.setMicrophoneMute(false); if(callStateListener != null) EMChatManager.getInstance().addVoiceCallStateChangeListener(callStateListener); } /** * 播放拨号响铃 * * @param sound * @param number */ protected int playMakeCallSounds() { try { // 最大音量 float audioMaxVolumn = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); // 当前音量 float audioCurrentVolumn = audioManager.getStreamVolume(AudioManager.STREAM_RING); float volumnRatio = audioCurrentVolumn / audioMaxVolumn; audioManager.setMode(AudioManager.MODE_RINGTONE); audioManager.setSpeakerphoneOn(false); // 播放 int id = soundPool.play(outgoing, // 声音资源 0.3f, // 左声道 0.3f, // 右声道 1, // 优先级,0最低 -1, // 循环次数,0是不循环,-1是永远循环 1); // 回放速度,0.5-2.0之间。1为正常速度 return id; } catch (Exception e) { return -1; } } // 打开扬声器 protected void openSpeakerOn() { try { if (!audioManager.isSpeakerphoneOn()) audioManager.setSpeakerphoneOn(true); audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } catch (Exception e) { e.printStackTrace(); } } // 关闭扬声器 protected void closeSpeakerOn() { try { if (audioManager != null) { // int curVolume = // audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); if (audioManager.isSpeakerphoneOn()) audioManager.setSpeakerphoneOn(false); audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); // audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, // curVolume, AudioManager.STREAM_VOICE_CALL); } } catch (Exception e) { e.printStackTrace(); } } /** * 保存通话消息记录 * @param type 0:音频,1:视频 */ protected void saveCallRecord(int type) { EMMessage message = null; TextMessageBody txtBody = null; if (!isInComingCall) { // 打出去的通话 message = EMMessage.createSendMessage(EMMessage.Type.TXT); message.setReceipt(username); } else { message = EMMessage.createReceiveMessage(EMMessage.Type.TXT); message.setFrom(username); } String st1 = getResources().getString(R.string.call_duration); String st2 = getResources().getString(R.string.Refused); String st3 = getResources().getString(R.string.The_other_party_has_refused_to); String st4 = getResources().getString(R.string.The_other_is_not_online); String st5 = getResources().getString(R.string.The_other_is_on_the_phone); String st6 = getResources().getString(R.string.The_other_party_did_not_answer); String st7 = getResources().getString(R.string.did_not_answer); String st8 = getResources().getString(R.string.Has_been_cancelled); switch (callingState) { case NORMAL: txtBody = new TextMessageBody(st1 + callDruationText); break; case REFUESD: txtBody = new TextMessageBody(st2); break; case BEREFUESD: txtBody = new TextMessageBody(st3); break; case OFFLINE: txtBody = new TextMessageBody(st4); break; case BUSY: txtBody = new TextMessageBody(st5); break; case NORESPONSE: txtBody = new TextMessageBody(st6); break; case UNANSWERED: txtBody = new TextMessageBody(st7); break; default: txtBody = new TextMessageBody(st8); break; } // 设置扩展属性 if(type == 0) message.setAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, true); else message.setAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, true); // 设置消息body message.addBody(txtBody); message.setMsgId(msgid); // 保存 EMChatManager.getInstance().saveMessage(message, false); } enum CallingState { CANCED, NORMAL, REFUESD, BEREFUESD, UNANSWERED, OFFLINE, NORESPONSE, BUSY } }