环信语音消息听筒和扬声器的切换

环信的语音和扬声器的切换,类似于微信qq的那种,当然比他们的简单。其实环信已经给我们写好了听筒或者扬声器的切换,我们只需要把原生的传感器和播放暂停的结合一下就可以了,android距离传感器,从网上随便找找都有。

在环信的easeui库中,你可以知道EaseChatRowVoicePlayClickListener这个是语音row播放点击事件监听,

public class EaseChatRowVoicePlayClickListener implements View.OnClickListener{
private static final String TAG = "VoicePlayClickListener";
EMMessage message;
EMVoiceMessageBody voiceBody;
ImageView voiceIconView;


private AnimationDrawable voiceAnimation = null;
MediaPlayer mediaPlayer = null;
ImageView iv_read_status;
Activity activity;
private ChatType chatType;
private BaseAdapter adapter;


public static boolean isPlaying = false;
public static EaseChatRowVoicePlayClickListener currentPlayListener = null;
public static String playMsgId;


private SensorManager mManager;//传感器管理对象
private MySensorEventListener eventListener;


public EaseChatRowVoicePlayClickListener(EMMessage message, ImageView v, ImageView iv_read_status, BaseAdapter adapter, Activity context) {
this.message = message;
voiceBody = (EMVoiceMessageBody) message.getBody();
this.iv_read_status = iv_read_status;
this.adapter = adapter;
voiceIconView = v;
this.activity = context;
this.chatType = message.getChatType();
mManager = (SensorManager)activity.getSystemService(Context.SENSOR_SERVICE);
eventListener = new MySensorEventListener();
// mManager.registerListener(eventListener, mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),// 距离感应器
// SensorManager.SENSOR_DELAY_NORMAL);//注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是延迟类型


}


public void stopPlayVoice() {


voiceAnimation.stop();
if (message.direct() == EMMessage.Direct.RECEIVE) {
voiceIconView.setImageResource(R.drawable.ease_chatfrom_voice_playing);
} else {
voiceIconView.setImageResource(R.drawable.ease_chatto_voice_playing);
}
// stop play voice
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
isPlaying = false;
playMsgId = null;
adapter.notifyDataSetChanged();
}
public void stopPlayVoiceOn() {

voiceAnimation.stop();
if (message.direct() == EMMessage.Direct.RECEIVE) {
voiceIconView.setImageResource(R.drawable.ease_chatfrom_voice_playing);
} else {
voiceIconView.setImageResource(R.drawable.ease_chatto_voice_playing);
}
// stop play voice
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
isPlaying = false;
playMsgId = null;
adapter.notifyDataSetChanged();
mManager.unregisterListener(eventListener,mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY));
}


public void playVoice(String filePath) {
mManager.registerListener(eventListener, mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),// 距离感应器
SensorManager.SENSOR_DELAY_NORMAL);//注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是延迟类型


if (!(new File(filePath).exists())) {
return;
}
playMsgId = message.getMsgId();
AudioManager audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);


mediaPlayer = new MediaPlayer();
if (EaseUI.getInstance().getSettingsProvider().isSpeakerOpened()) {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);
} else {
audioManager.setSpeakerphoneOn(false);// 关闭扬声器
// 把声音设定成Earpiece(听筒)出来,设定为正在通话中
audioManager.setMode(AudioManager.MODE_IN_CALL);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
}
try {
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {


@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mediaPlayer.release();
mediaPlayer = null;
stopPlayVoice(); // stop animation


mManager.unregisterListener(eventListener,mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY));
}


});
isPlaying = true;
currentPlayListener = this;
mediaPlayer.start();
showAnimation();


// 如果是接收的消息
if (message.direct() == EMMessage.Direct.RECEIVE) {
if (!message.isAcked() && chatType == ChatType.Chat) {
// 告知对方已读这条消息
EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(), message.getMsgId());
}
if (!message.isListened() && iv_read_status != null && iv_read_status.getVisibility() == View.VISIBLE) {
// 隐藏自己未播放这条语音消息的标志
iv_read_status.setVisibility(View.INVISIBLE);
message.setListened(true);
EMClient.getInstance().chatManager().setMessageListened(message);
}


}


} catch (Exception e) {
System.out.println();
}
}


// show the voice playing animation
private void showAnimation() {
// play voice, and start animation
if (message.direct() == EMMessage.Direct.RECEIVE) {
voiceIconView.setImageResource(R.anim.voice_from_icon);
} else {
voiceIconView.setImageResource(R.anim.voice_to_icon);
}
voiceAnimation = (AnimationDrawable) voiceIconView.getDrawable();
voiceAnimation.start();
}


@Override
public void onClick(View v) {


if (isPlaying) {
Log.d("Easevoice", "EaseChatRowVoicePlayClickListener=====OnClick==="+isPlaying);
if (playMsgId != null && playMsgId.equals(message.getMsgId())) {
currentPlayListener.stopPlayVoiceOn();
return;
}
currentPlayListener.stopPlayVoiceOn();
}


palyVoiceMessage();
}


private void palyVoiceMessage() {
String st = activity.getResources().getString(R.string.Is_download_voice_click_later);
if (message.direct() == EMMessage.Direct.SEND) {
// for sent msg, we will try to play the voice file directly
playVoice(voiceBody.getLocalUrl());
} else {
if (message.status() == EMMessage.Status.SUCCESS) {
File file = new File(voiceBody.getLocalUrl());
if (file.exists() && file.isFile())
playVoice(voiceBody.getLocalUrl());
else
EMLog.e(TAG, "file not exist");


} else if (message.status() == EMMessage.Status.INPROGRESS) {
Toast.makeText(activity, st, Toast.LENGTH_SHORT).show();
} else if (message.status() == EMMessage.Status.FAIL) {
Toast.makeText(activity, st, Toast.LENGTH_SHORT).show();
new AsyncTask<Void, Void, Void>() {


@Override
protected Void doInBackground(Void... params) {
EMClient.getInstance().chatManager().downloadAttachment(message);
return null;
}


@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
adapter.notifyDataSetChanged();
}


}.execute();


}


}
}




class MySensorEventListener implements SensorEventListener{


@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub


float[] its = event.values;


if (its != null && event.sensor.getType() == Sensor.TYPE_PROXIMITY) {


System.out.println("its[0]:" + its[0]);
if (its[0] == 0.0) {// 贴近手机
EaseUI.getInstance().getSettingsProvider().setSpeakerOpened(false);
} else {// 远离手机
EaseUI.getInstance().getSettingsProvider().setSpeakerOpened(true);
}
if(isPlaying){
Log.d("Easevoice", "EaseChatRowVoicePlayClickListener=====isPlaying==="+isPlaying);
currentPlayListener.stopPlayVoice();
// if (playMsgId != null && playMsgId.equals(message.getMsgId())) {
// currentPlayListener.stopPlayVoice();
// return;
// } else {
// currentPlayListener.stopPlayVoice();
// }
}
palyVoiceMessage();
}


}
}
}






EaseUI的EaseSettingsProvider中增加一个boolean值的方法。  

void setSpeakerOpened(boolean isOpen);

接下来按照提示做,把错误修改了就可以了。

没有写过几篇,有不好的地方欢迎指出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值