Android编程实战——仿微信群聊-4——Media语音

来源:互联网 发布:租赁网络平台 编辑:程序博客网 时间:2024/03/28 18:47

Android编程实战——仿微信群聊-4——Media语音

项目源代码移步github

服务器客户端通信建立完毕,接下来就是传输数据了,这里我们要发送语音的话就需要用的Adroid的MiediaPlayer类和 MediaRecorder类。前者用来播放语音文件,后者用来录音。这里用一个AudioMananger类把功能包装起来。

AudioMananger:

public class AudioMananger implements IAudioMananger {    private String filePath; //文件路径    private String dirPath; // 目录路径    private final String TAG="audio";    private MediaRecorder mediaRecorder; //录音类    private MediaPlayer mediaPlayer; //播放类    private static final int MAX_LENGTH = 1000 * 60 *20; //最大录音时长    private long time ; //录音时长    private long startTime;    private long endTime;    public AudioMananger() {        //默认目录路径/sdcard/record/        this.dirPath = AudioFile.SAVE_AUDIO_DIR_PATH;    }    public AudioMananger(String dirPath) {        this.dirPath = dirPath;    }    /**     * 开始录音 使用amr格式     */    @Override    public void startRecoder() {        try {            //创建文件目录            Log.i("dirPath",dirPath);            File dir=new File(dirPath);            if(!dir.exists()) {                dir.mkdirs();                Log.i("folder", "create folder");            }            //实例化MediaRecoder对象            if (mediaRecorder == null) {                mediaRecorder = new MediaRecorder();            }            //以当前时间为文件名并获得文件路径            String name = Time.getTime();            filePath=dirPath + "/" + name + ".amr"; //获得文件绝对路径            //设置MediaRecoder            mediaRecorder.setOutputFile(filePath); //设置输出文件            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置音频源为麦克风            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); //设置输出格式            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置音频编码            mediaRecorder.setMaxDuration(MAX_LENGTH); //设置最大时间            //准备            mediaRecorder.prepare();            //开始            mediaRecorder.start();            Log.i("start", "startRecoder");            startTime = System.currentTimeMillis();        }catch (IllegalStateException e) {            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());        } catch (IOException e) {            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());        }    }    /**     * 停止录音(保存录音文件即发送语音)     * @return     */    @Override    public String stopRecoder() {        mediaRecorder.stop();        endTime = System.currentTimeMillis();        time = endTime - startTime;        mediaRecorder.reset();        mediaRecorder.release();        Log.i("file Path", filePath);        mediaRecorder = null;        return filePath;    }    /**     * 取消录音(不保存录音文件)     */    @Override    public void cancelRecoder() {        mediaRecorder.stop();        mediaRecorder.reset();        mediaRecorder.release();        mediaRecorder = null;        File file = new File(filePath);        if (file.exists()) {            file.delete();        }        filePath = "";    }    /**     * 播放语音文件     * @param filePath 文件地址     */    @Override    public void palyAudio(String filePath) {        if (mediaPlayer == null) {            mediaPlayer = new MediaPlayer();        }        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {            @Override            public void onCompletion(MediaPlayer mp) {                stopPlay();            }        });        try {            mediaPlayer.setDataSource(filePath);            mediaPlayer.prepare();            mediaPlayer.start();        } catch (IOException e) {            e.printStackTrace();        }        }    /**     * 获取录音时长     * @return     */    @Override    public float getTime() {        return Float.valueOf(time);    }    /**     * 停止播放语音文件     */    @Override    public void stopPlay() {        mediaPlayer.stop();        mediaPlayer.release();        mediaPlayer = null;    }    /**     * 判断是否正在播放     * @return     */    @Override    public boolean isPlaying() {        if (mediaPlayer != null) {            return mediaPlayer.isPlaying();        }else {            return false;        }    }}

‘’
这里面有一个AudioFile类,是文件路径的类,还有一点需要注意:MediaRecorder的设置需要按照顺序来设置。
AudioFile:

public class AudioFile {    public static final  String SAVE_AUDIO_DIR_PATH = Environment.getExternalStorageDirectory()+"/record";    public static final  String RECEIVE_AUDIO_DIR_PATH = Environment.getExternalStorageDirectory()+"/record0";}
0 0
原创粉丝点击