Android 分享临医app录音管理基类实现

临医app录音管理基类

删除了跟商业隐私有关函数,只剩下功能函数,希望能给大家带来帮助。
其中振幅功能是为了提供根据声音大小而变化的波动动画,有兴趣的同学可以私信我索取。
有MP3转换功能,这方面个人觉得在Android机器上做录音转换并不太好,可以把音频转换模块放到服务器上执行。

package com.utils.tools;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;

import android.media.MediaRecorder;
import android.os.Environment;
import android.os.Handler;
import android.text.format.DateFormat;
import android.util.Log;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;

public class RecordManger {
	private static final String LOG_TAG = "AudioRecord"; 
	
    /**amr*/
	private File file = new File(Environment.getExternalStorageDirectory().getPath()+"/rec/"
			+ "luyin"
			+ DateFormat.format("yyyyMMdd_HHmmss",
					Calendar.getInstance(Locale.CHINA)) + ".amr");
//	 /**mp3*/
//	private File file1 = new File("/sdcard/"
//			+ "YY/"
//			+ DateFormat.format("yyyyMMdd_HHmmss",
//					Calendar.getInstance(Locale.CHINA)) + ".mp3");
    /**android录音*/
	private MediaRecorder mr;
    /**声音振幅回调*/
    private SoundAmplitudeListen soundAmplitudeListen;
    
	private final Handler mHandler = new Handler();
	private Runnable mUpdateMicStatusTimer = new Runnable() {
		private int BASE = 600;
        private int RATIO=5;
    	private int postDelayed =200;
		public void run() {
			  // int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768;  
            int ratio =mr.getMaxAmplitude() / BASE;  
            int db = (int) (20 * Math.log10(Math.abs(ratio)));  
            int value=db / RATIO;
            if(value<0)value=0;
            if(soundAmplitudeListen!=null)
            	soundAmplitudeListen.amplitude(ratio, db, value);
			mHandler.postDelayed(mUpdateMicStatusTimer, postDelayed);
		}
	};

	// 生成文件夹
		public static void makeRootDirectory() {
		    File file = null;
		    try {
		        file = new File(Environment.getExternalStorageDirectory().getPath()+"/linyirec/");
		        if (!file.exists()) {
		            file.mkdir();
		        }
		    } catch (Exception e) {
		        Log.i("error:", e+"");
		    }
		}
	
    /**开始录音*/
	public void startRecordCreateFile() throws IOException {
		if (!Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED)) {

			return;
		}
		makeRootDirectory();;
		file.createNewFile();
//		file1.createNewFile();
		mr = new MediaRecorder();
		mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
		mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
		mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
		mr.setOutputFile(file.getAbsolutePath());
		
		// 按照mediarecorder文档步骤
			mr.prepare();  
	      	mr.start();
		//录音线程
		mHandler.post(mUpdateMicStatusTimer);
	}
	
	//转换amr为mp3的函数
	public static void changeToMp3(String sourcePath, String targetPath) {  
        File source = new File(sourcePath);  
        File target = new File(targetPath);  
        
        AudioAttributes audio = new AudioAttributes();  
        Encoder encoder = new Encoder();  
  
        audio.setCodec("libmp3lame");  
        audio.setBitRate(new Integer(128000));
        audio.setChannels(new Integer(2));
        audio.setSamplingRate(new Integer(44100));
        EncodingAttributes attrs = new EncodingAttributes();  
        attrs.setFormat("mp3");  
        attrs.setAudioAttributes(audio);  
  
        try {  
            encoder.encode(source, target, attrs);  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        } catch (InputFormatException e) {  
            e.printStackTrace();  
        } catch (EncoderException e) {  
            e.printStackTrace();  
        }  
    }  
	
	
    //停止录音
	public File stopRecord() {

		if (mr != null ) {
//			mr.setOnErrorListener(null);
//			mr.setOnInfoListener(null);  
//			mr.setPreviewDisplay(null);
			mr.stop();
			mr.reset();
			mr.release();
			mr = null;
			mHandler.removeCallbacks(mUpdateMicStatusTimer);
		}
//		changeToMp3(file.getAbsolutePath(), file1.getAbsolutePath());
		return file;
	}
	
	 //重置
		public void reRecord() {

			if (mr != null) {
				mr.stop();
				mr.reset();
				mr.release();
				mr = null;
			}
			shanchu();
//			changeToMp3(file.getAbsolutePath(), file1.getAbsolutePath());
		}

	public File getFile() {
		return file;
	}
	
	public void shanchu(){
		if (file.exists()) { // 判断文件是否存在
			if (file.isFile()) { // 判断是否是文件
			file.delete(); // delete()方法 你应该知道 是删除的意思;
			} else if (file.isDirectory()) { // 否则如果它是一个目录
//			File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
//			for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
//			this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
//			}
			}
			file.delete();
			} else {
//			Constants.Logdada("文件不存在!"+"\n");
			}
	}

	public void setFile(File file) {
		this.file = file;
	}

	public MediaRecorder getMr() {
		return mr;
	}

	public void setMr(MediaRecorder mr) {
		this.mr = mr;
	}
	public SoundAmplitudeListen getSoundAmplitudeListen() {
		return soundAmplitudeListen;
	}

	public void setSoundAmplitudeListen(SoundAmplitudeListen soundAmplitudeListen) {
		this.soundAmplitudeListen = soundAmplitudeListen;
	}
   public interface SoundAmplitudeListen{
	   public void amplitude(int amplitude,int db,int value);
   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值