android 语音聊天播放动画的问题

android 语音聊天播放动画的问题

 欢迎大家进群:574605026   开启我们的开发之旅
可能现在还有人不知道我这个标题写的到底是什么问题
大家先看图,我再给大家解释

看图说话大家是不是就明白多了,这篇博客呢,不是给大家讲解实现即时通讯聊天功能的,
主要是给大家说下这里面语音播放动画的问题,会遇到什么问题呢,可能会遇到,在你播放第一个语音的时候,
第一个语音还没有播放完,你就点击第二个进行播放,这时候就出现了第一个语音的动画一直在播放状态。
这样会让客户的体验很不好,此博客在致力于解决这个问题。

直接看代码吧
首先是语音点击事件:
就是这么一句话,如果不知道各个参数是什么意思的话,就看下面对click的封装吧
ll_voice.setOnClickListener(new VoicePlayClickListener(msg,iv_voice1,this, (Activity) mContext,filePath));

VoicePlayClickListener.class

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.sharetime.mobileoffice.R;
import com.sharetime.mobileoffice.crm.utils.UrlUtil;
import com.sharetime.mobileoffice.entity.LsMessageObj;
import com.sharetime.mobileoffice.ui.ChatActivity;

import java.io.File;

/*****************************************************
 * author:      wz
 * email:       wangzhong0116@foxmail.com
 * version:     1.0
 * date:        2016/12/13 15:03
 * description: 播放语音监听事件
 *              主要解决在播放的时候,点击下一个语音,
 *              导致没有播放完成的语音动画停止不了的
 *              原因。
 *****************************************************/

public class VoicePlayClickListener implements View.OnClickListener {

    ImageView voiceIconView;
    MediaPlayer mediaPlayer = null;
    Activity activity;
    private BaseAdapter adapter;
    private String voicePath="";
    private LsMessageObj message;

    public static boolean isPlaying = false;
    public static VoicePlayClickListener currentPlayListener = null;


    /**
     * 首先我简单解释下这几个产出的含义
     * @param message   消息实体类
     * @param voiceIconView  语音播放ImageView
     * @param adapter    聊天列表适配器
     * @param activity   聊天Activity
     * @param voicePath  语音路径
     */
    public VoicePlayClickListener(LsMessageObj message, ImageView voiceIconView, BaseAdapter adapter, Activity activity,
                                  String voicePath) {
        this.message=message;
        this.adapter = adapter;
        this.voiceIconView = voiceIconView;
        this.activity = activity;
        this.voicePath=voicePath;
    }

    public void stopPlayVoice() {
        if (!message.getCreate_user_id().equals(UrlUtil.getUserId())) {
            voiceIconView.setImageResource(R.mipmap.button_voice);
        } else {
            voiceIconView.setImageResource(R.mipmap.button_voice1);
        }
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
        isPlaying = false;
        ((ChatActivity) activity).playMsgId = null;
        adapter.notifyDataSetChanged();
    }

    public void playVoice(String filePath) {
        if (!(new File(filePath).exists())) {
            return;
        }
        ((ChatActivity) activity).playMsgId = message.getId()+"";
        AudioManager audioManager = (AudioManager) activity
                .getSystemService(Context.AUDIO_SERVICE);

        mediaPlayer = new MediaPlayer();
            audioManager.setMode(AudioManager.MODE_NORMAL);
            audioManager.setSpeakerphoneOn(true);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);

        try {
            mediaPlayer.setDataSource(filePath);
            mediaPlayer.prepare();
            mediaPlayer
                    .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            mediaPlayer.release();
                            mediaPlayer = null;
                            stopPlayVoice(); // stop animation
                        }

                    });
            isPlaying = true;
            currentPlayListener = this;
            mediaPlayer.start();
            showAnimation();
        } catch (Exception e) {
        }
    }

    /**
     * 展示播放动画
     * 此处使用的是glide播放的gif动画,投机取巧下
     * 不过大家也可以使用anim来播放动画
     */
    private void showAnimation() {
        if (!message.getCreate_user_id().equals(UrlUtil.getUserId())) {
            Glide.with(activity).load(R.drawable.voice1).into(voiceIconView);
        } else {
            Glide.with(activity).load(R.drawable.voice2).into(voiceIconView);
        }
    }

    @Override
    public void onClick(View v) {
        if (isPlaying) {
            if (((ChatActivity) activity).playMsgId != null
                    && ((ChatActivity) activity).playMsgId.equals(message
                    .getId()+"")) {
                currentPlayListener.stopPlayVoice();
                return;
            }
            currentPlayListener.stopPlayVoice();
        }

        playVoice(voicePath);
    }
}
  简单就是这样,代码注释都写了,大家应该都能够看懂。

如果细心的朋友,应该会看到我最近写的博客都是关于聊天方面的,
最近在做聊天功能,没有使用任何第三方,使用websocket,大家也可以去研究研究
本来呢,打算做个聊天的demo,给大家总结下,供大家参考,最近时间实在是太紧了,
等以后有时间了,一定做个完整的demo出来,希望大家多多给与支持,今天就说到这里,
大家如果有谁在做聊天功能,如果有什么问题呢,可以相互探讨。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值