1. 设置按钮的TouchListener
- but_audio.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) { // 判断当前点击状态
- case MotionEvent.ACTION_DOWN: // 按下
- mSoundPool.play(down_music, 1, 1, 0, 0, 1); // 播放按钮铃声
- if (!isRecordingAudio) { // 判断不处于录音状态
- // 计算出上次开始时间和本次开始录音时间间隔,如果小于1S,提示用户,不录音
- long intervalTime = System.currentTimeMillis()
- - startTime;
- if (intervalTime < 1000) {
- Toast.makeText(MessageActivity.this, "操作太频繁,请稍后使用",
- 0).show();
- return false;
- }
- RecordingAudio();
- }
- break;
- case MotionEvent.ACTION_UP: // 移开
- if (isRecordingAudio) {
- new Thread() {
- public void run() {
- SystemClock.sleep(100); // 睡一会,在停止录音
- mMediaRecorder.stop(); // 停止录音
- mMediaRecorder.release(); // 释放资源
- mMediaRecorder = null; // 回收
- message = new Message();
- message.what = 1;
- mHandler.sendMessage(message);
- };
- }.start();
- }
- isRecordingAudio = false;
- break;
- case MotionEvent.ACTION_MOVE: // 滑动
- break;
- }
- return false;
- }
- });
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- long stopTime = System.currentTimeMillis() - startTime;
- if (stopTime < 1000) {
- Toast.makeText(MessageActivity.this, "录音时间太短,无法发送", 0).show();
- deleteAudioFile(fileName);
- } else {
- intendFileUpload();
- mFileUpload.setFile(myRecAudioFile);
- mFileUpload.setMessageType(SycConstant.Message_Type_sound);
- // 发送语音消息
- mFileUpload.startUpLoad();
- MessageActivity.this.sendMessage(SycConstant.Message_Type_sound, GloableParameters.DIR_PATH + fileName);
- mSoundPool.play(up_music, 1, 1, 0, 0, 1); // 播放按钮铃声
- }
- break;
- case 2:
- getData();
- break;
- }
- }
- };
3. 提示音的初始化
- private SoundPool mSoundPool; // 声明一个SoundPool,用来播放一段语音
- private int down_music; // 定义一个整型用load();来设置suondID
- private int up_music; // 松开的声音
- mSoundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);// 第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量
- down_music = mSoundPool.load(getApplicationContext(), R.raw.down_audio,1); // 把你的声音素材放到res/raw里,第2个参数即为资源文件,第3个为音乐的优先级
- up_music = mSoundPool.load(getApplicationContext(), R.raw.up_audio, 1);
4. 录音的方法
- /**
- * 录音
- */
- private void RecordingAudio() {
- File myRecAudioDir = new File(GloableParameters.DIR_PATH); // 创建录音文件存储目录
- try {
- myRecAudioFile = File.createTempFile(String.valueOf(System.currentTimeMillis()) ,".amr", myRecAudioDir); // 创建录音文件
- fileName = myRecAudioFile.getName();
- mMediaRecorder = new MediaRecorder();
- mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 第1步:设置音频来源(MIC表示麦克风)
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 第2步:设置音频输出格式(默认的输出格式)
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 第3步:设置音频编码方式(默认的编码方式)
- mMediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath()); // 第4步:指定音频输出文件
- mMediaRecorder.prepare(); // 第5步:调用prepare方法
- if (!isRecordingAudio) { // 判断当前是否处于录音状态
- mMediaRecorder.start(); // 第6步:调用start方法开始录音
- startTime = System.currentTimeMillis(); // 记录开启录音时间
- isRecordingAudio = true; // 记录录音状态
- }
- } catch (IOException e) {
- // 录音出现异常
- }
- }