明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1463|回复: 9

[提问] 接入微软康娜,调用录音问题

[复制链接]
发表于 2019-7-20 19:52:20 | 显示全部楼层 |阅读模式
本帖最后由 1291500406 于 2019-7-25 16:39 编辑

package com.video.zlc.audioplayer;
import com.czt.mp3recorder.MP3Recorder;
import com.video.zlc.audioplayer.utils.LogUtil;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
* @author zlc
*/
public class AudioManage {
    private MP3Recorder mRecorder;
    private String mDir;             // 文件夹的名称
    private String mCurrentFilePath;
    private static AudioManage mInstance;
    private boolean isPrepared; // 标识MediaRecorder准备完毕
    private AudioManage(String dir) {
        mDir = dir;
        LogUtil.e("AudioManage=",mDir);
    }
    /**
     * 回调“准备完毕”
     * @author zlc
     */
    public interface AudioStateListenter {
        void wellPrepared();    // prepared完毕
    }
    public AudioStateListenter mListenter;
    public void setOnAudioStateListenter(AudioStateListenter audioStateListenter) {
        mListenter = audioStateListenter;
    }
    /**
     * 使用单例实现 AudioManage
     * @param dir
     * @return
     */
    public static AudioManage getInstance(String dir) {
        if (mInstance == null) {
            synchronized (AudioManage.class) {   // 同步
                if (mInstance == null) {
                    mInstance = new AudioManage(dir);
                }
            }
        }
        return mInstance;
    }
    /**
     * 准备录音
     */
    public void prepareAudio() {
        try {
            isPrepared = false;
            File dir = new File(mDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            String fileName = GenerateFileName(); // 文件名字
            File file = new File(dir, fileName);  // 路径+文件名字
            //MediaRecorder可以实现录音和录像。需要严格遵守API说明中的函数调用先后顺序.
            mRecorder = new MP3Recorder(file);
            mCurrentFilePath = file.getAbsolutePath();
//          mMediaRecorder = new MediaRecorder();
//          mCurrentFilePath = file.getAbsolutePath();
//          mMediaRecorder.setOutputFile(file.getAbsolutePath());    // 设置输出文件
//          mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);    // 设置MediaRecorder的音频源为麦克风
//          mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);    // 设置音频的格式
//          mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);    // 设置音频的编码为AMR_NB
//          mMediaRecorder.prepare();
//          mMediaRecorder.start();
            mRecorder.start();   //开始录音
            isPrepared = true; // 准备结束
            if (mListenter != null) {
                mListenter.wellPrepared();
            }
        } catch (Exception e) {
            e.printStackTrace();
            LogUtil.e("prepareAudio",e.getMessage());
        }
    }
    /**
     * 随机生成文件名称
     * @return
     */
    private String GenerateFileName() {
        // TODO Auto-generated method stub
        return UUID.randomUUID().toString() + ".mp3"; // 音频文件格式
    }

    /**
     * 获得音量等级——通过mMediaRecorder获得振幅,然后换算成声音Level
     * maxLevel最大为7;
     * @return
     */
    public int getVoiceLevel(int maxLevel) {
        if (isPrepared) {
            try {
                mRecorder.getMaxVolume();
                return maxLevel * mRecorder.getMaxVolume() / 32768 + 1;
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }
        return 1;
    }
    /**
     * 释放资源
     */
    public void release() {
        if(mRecorder != null) {
            mRecorder.stop();
            mRecorder = null;
        }
    }
    /**
     * 停止录音
     */
    public void stop(){
        if(mRecorder!=null && mRecorder.isRecording()){
            mRecorder.stop();
        }
    }
    /**
     * 取消(释放资源+删除文件)
     */
    public void delete() {
        release();
        if (mCurrentFilePath != null) {
            File file = new File(mCurrentFilePath);
            file.delete();    //删除录音文件
            mCurrentFilePath = null;
        }
    }
    public String getCurrentFilePath() {
        return mCurrentFilePath;
    }
    public int getMaxVolume(){
        return mRecorder.getMaxVolume();
    }
    public int getVolume(){
        return mRecorder.getVolume();
    }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
2. 语音播放器封装

package com.video.zlc.audioplayer.utils;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
/**
*
* @author zlc
*
*/
public class MediaManager {
    private static MediaPlayer mMediaPlayer;   //播放录音文件
    private static boolean isPause = false;
    static {
        if(mMediaPlayer==null){
            mMediaPlayer=new MediaPlayer();
            mMediaPlayer.setOnErrorListener( new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    mMediaPlayer.reset();
                    return false;
                }
            });
        }
    }

    /**
     * 播放音频
     * @param filePath
     * @param onCompletionListenter
     */
    public static void playSound(Context context,String filePath, MediaPlayer.OnCompletionListener onCompletionListenter){
        if(mMediaPlayer==null){
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnErrorListener( new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    mMediaPlayer.reset();
                    return false;
                }
            });
        }else{
            mMediaPlayer.reset();
        }
        try {
            //详见“MediaPlayer”调用过程图
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.setOnCompletionListener(onCompletionListenter);
            mMediaPlayer.setDataSource(filePath);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            LogUtil.e("语音error==",e.getMessage());
        }
    }

    /**
     *  暂停
     */
    public synchronized static void pause(){
        if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
            isPause=true;
        }
    }
    //停止
    public synchronized static void stop(){
        if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
            mMediaPlayer.stop();
            isPause=false;
        }
    }
    /**
     * resume继续
     */
    public synchronized static void resume(){
        if(mMediaPlayer!=null && isPause){
            mMediaPlayer.start();
            isPause=false;
        }
    }
    public static boolean isPause(){
        return isPause;
    }
    public static void setPause(boolean isPause) {
        MediaManager.isPause = isPause;
    }
    /**
     * release释放资源
     */
    public static void release(){
        if(mMediaPlayer!=null){
            isPause = false;
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
    public synchronized static void reset(){
        if(mMediaPlayer!=null) {
            mMediaPlayer.reset();
            isPause = false;
        }
    }
    /**
     * 判断是否在播放视频
     * @return
     */
    public synchronized static boolean isPlaying(){
        return mMediaPlayer != null && mMediaPlayer.isPlaying();
    }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
3. 语音列表顺序播放

private int lastPos = -1;
    //播放语音
private void playVoice(final int position, String from) {
        LogUtil.e("playVoice position",position+"");
        if(position >= records.size()) {
            LogUtil.e("playVoice","全部播放完了");
            stopAnimation();
            MediaManager.reset();
            return;
        }
        String voicePath = records.get(position).getPath();
        LogUtil.e("playVoice",voicePath);
        if(TextUtils.isEmpty(voicePath) || !voicePath.contains(".mp3")){
            Toast.makeText(this,"语音文件不合法",Toast.LENGTH_LONG).show();
            return;
        }
        if(lastPos != position && "itemClick".equals(from)){
            stopAnimation();
            MediaManager.reset();
        }
        lastPos = position;
//获取listview某一个条目的图片控件
        int pos = position - id_list_voice.getFirstVisiblePosition();
        View view = id_list_voice.getChildAt(pos);
        id_iv_voice = (ImageView) view.findViewById(R.id.id_iv_voice);
        LogUtil.e("playVoice position",pos+"");
        if(MediaManager.isPlaying()){
            MediaManager.pause();
            stopAnimation();
        }else if(MediaManager.isPause()){
            startAnimation();
            MediaManager.resume();
        }else{
            startAnimation();
            MediaManager.playSound(this,voicePath, new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    //播放完停止动画 重置MediaManager
                    stopAnimation();
                    MediaManager.reset();
                    playVoice(position + 1, "loop");
                }
            });
        }
    }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
4. 语音列表单个播放  复用问题处理
播放逻辑基本同上

  private int lastPosition = -1;
    private void playVoice(FendaListInfo.ObjsEntity obj, int position) {
        String videoPath = obj.path;
        if(TextUtils.isEmpty(videoPath) || !videoPath.contains(".mp3")){
            Toast.makeText(this,"语音文件不合法",Toast.LENGTH_LONG).show();
            return;
        }
        if(position != lastPosition){  //点击不同条目先停止动画 重置音频资源
            stopAnimation();
            MediaManager.reset();
        }
        if(mAdapter!=null)
            mAdapter.selectItem(position, lastPosition);
        lastPosition = position;
        id_iv_voice.setBackgroundResource(R.drawable.animation_voice);
        animationDrawable = (AnimationDrawable) id_iv_voice.getBackground();
        if(MediaManager.isPlaying()){
            stopAnimation();
            MediaManager.pause();
        }else if(MediaManager.isPause()){
            startAnimation();
            MediaManager.resume();
        }else{
            startAnimation();
            MediaManager.playSound(this,videoPath, new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    LogUtil.e("onCompletion","播放完成");
                    stopAnimation();
                    MediaManager.stop();
                }
            });
        }
    }
//核心方法
//点击了某一个条目 这个条目isSelect=true 上一个条目isSelect需要改为false 防止滑动过程中 帧动画复用问题
    public void selectItem(int position, int lastPosition) {
        LogUtil.e("selectItem"," ;lastPosition="+lastPosition+" ;position="+position);
        if(lastPosition >= 0 && lastPosition < mDatas.size() && lastPosition != position){
            FendaListInfo.ObjsEntity bean = mDatas.get(lastPosition);
            bean.isSelect = false;
            mDatas.set(lastPosition, bean);
            notifyDataSetChanged();
        }
        if(position < mDatas.size() && position != lastPosition){
            FendaListInfo.ObjsEntity bean = mDatas.get(position);
            bean.isSelect = true;
            mDatas.set(position,bean);
        }
    }
/**
* 适配器图片播放的动画处理
*/
private void setVoiceAnimation(ImageView iv_voice, FendaListInfo.ObjsEntity obj) {
        //处理动画复用问题
        AnimationDrawable animationDrawable;
        if(obj.isSelect){
            iv_voice.setBackgroundResource(R.drawable.animation_voice);
            animationDrawable = (AnimationDrawable) iv_voice.getBackground();
            if(MediaManager.isPlaying() && animationDrawable!=null){
                animationDrawable.start();
            }else{
                iv_voice.setBackgroundResource(R.drawable.voice_listen);
                animationDrawable.stop();
            }
        }else{
            iv_voice.setBackgroundResource(R.drawable.voice_listen);
        }
    }


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-21 01:26:07 | 显示全部楼层
先收下了,不过有点不知道这干嘛用的
 楼主| 发表于 2019-7-21 08:36:30 | 显示全部楼层
本帖最后由 1291500406 于 2019-7-25 16:29 编辑

[quote]wang8091 发表于 2019-7-21 01:26

lisp接入微软康娜问题
发表于 2019-7-21 17:04:16 | 显示全部楼层
谢谢 !!! 1291500406 分享学习!!!!!
发表于 2019-7-22 08:52:18 | 显示全部楼层
很强大。对话框竟然没有退出机制,运行后只能强制关CAD。
 楼主| 发表于 2019-7-22 09:00:10 | 显示全部楼层
本帖最后由 1291500406 于 2019-7-25 16:29 编辑
cghdy 发表于 2019-7-22 08:52
很强大。对话框竟然没有退出机制,运行后只能强制关CAD。

点图像按钮,退出界面,

点评

多谢解答,很实用  发表于 2019-7-22 10:28
 楼主| 发表于 2019-7-24 10:00:39 | 显示全部楼层
本帖最后由 1291500406 于 2019-7-24 10:02 编辑

更新了一下文件,从398压缩到219
发表于 2019-7-24 21:21:39 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 15:41 , Processed in 0.281993 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表