package edu.minggo.chat.util; import java.io.File; import java.io.IOException; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnDismissListener; import android.media.MediaRecorder; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import edu.minggo.chat.R; /** * ��ס¼����ť * @author minggo * @created 2013-2-16����03:42:13 */ public class RecordButton extends Button{ public RecordButton(Context context) { super(context); init(); } public RecordButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public RecordButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void setOnEventListener(OnEventListener onEventListener) { this.onEventListener = onEventListener; } private String mFileName = null; private OnEventListener onEventListener; private static final int MIN_INTERVAL_TIME = 2000;// 2s private long startTime; private Dialog recordIndicator; private static int[] res = { R.drawable.amp1, R.drawable.amp2, R.drawable.amp3, R.drawable.amp4,R.drawable.amp5 , R.drawable.amp6,R.drawable.amp7}; private static ImageView view; private MediaRecorder recorder; private ObtainDecibelThread thread; private Handler volumeHandler; private void init() { volumeHandler = new ShowVolumeHandler(); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: setBackgroundResource(R.drawable.voice_rcd_btn_pressed); setText("���� ����"); initDialogAndStartRecord(); break; case MotionEvent.ACTION_UP: finishRecord(); setText("��ס ˵��"); setBackgroundResource(R.drawable.voice_rcd_btn_nor); break; case MotionEvent.ACTION_CANCEL:// ����ָ�ƶ���view���棬��cancel cancelRecord(); setText("��ס ˵��"); setBackgroundResource(R.drawable.voice_rcd_btn_nor); Toast.makeText(getContext(), "�ѷ���¼��", 2000).show(); break; } return true; } private void initDialogAndStartRecord() { startTime = System.currentTimeMillis(); recordIndicator = new Dialog(getContext(), R.style.LoadingDialogStyle); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.voice_record_dialog, null); view = (ImageView) (layout.findViewById(R.id.linearLayout1).findViewById(R.id.voice_record_iv_heigher)); view.setImageResource(res[0]); recordIndicator.setContentView(layout); recordIndicator.setOnDismissListener(onDismiss); recordIndicator.show(); try { startRecording(); } catch (Exception e) { e.printStackTrace(); } } private void finishRecord() { stopRecording(); recordIndicator.dismiss(); System.out.println(System.currentTimeMillis()+"==ddddddd==="+startTime+"ffff"+mFileName); long intervalTime = System.currentTimeMillis() - startTime; if (intervalTime < MIN_INTERVAL_TIME) { Toast.makeText(getContext(), "ʱ��̫�̣�", Toast.LENGTH_SHORT).show(); File f = new File(mFileName); f.delete(); }else{ if (onEventListener != null) onEventListener.onFinishedRecord(mFileName,(int)intervalTime/1000); } } private void cancelRecord() { stopRecording(); recordIndicator.dismiss(); Toast.makeText(getContext(), "ȡ��¼����", Toast.LENGTH_SHORT).show(); File file = new File(mFileName); file.delete(); } private void startRecording()throws Exception{ mFileName=ClippingSounds.saveSounds(); System.out.println("��ʼ��ʱ��-----��"+mFileName); recorder = new MediaRecorder(); if(onEventListener!=null){ onEventListener.onStartRecord(); } try { recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(mFileName); recorder.setMaxDuration(180*1000); recorder.prepare(); //startRecordListener.onStartRecord(); recorder.start(); } catch (IOException e) { e.printStackTrace(); } thread = new ObtainDecibelThread(); thread.start(); } private void stopRecording() { if (thread != null) { thread.exit(); thread = null; } if (recorder != null) { try{ recorder.stop(); recorder.release(); recorder = null; }catch (Exception e) { e.printStackTrace(); } } } private class ObtainDecibelThread extends Thread { private volatile boolean running = true; public void exit() { running = false; } @Override public void run() { while (running) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (recorder == null || !running) { break; } int x = recorder.getMaxAmplitude(); if (x != 0) { int f = (int) (10 * Math.log(x) / Math.log(10)); if (f < 25) volumeHandler.sendEmptyMessage(0); else if (f < 30) volumeHandler.sendEmptyMessage(1); else if (f < 35) volumeHandler.sendEmptyMessage(2); else if (f < 40) volumeHandler.sendEmptyMessage(3); else if (f < 45) volumeHandler.sendEmptyMessage(4); else if (f < 48) volumeHandler.sendEmptyMessage(5); else volumeHandler.sendEmptyMessage(6); } } } } private OnDismissListener onDismiss = new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { stopRecording(); } }; static class ShowVolumeHandler extends Handler { @Override public void handleMessage(Message msg) { view.setImageResource(res[msg.what]); } } public interface OnEventListener { public void onFinishedRecord(String audioPath,int time); public void onStartRecord(); } }