android MediaRecorder录音

录音相关权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>


主程序代码:

package com.yqy.yqy_record;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

	private Button btn;
	private ListView lv;
	private SimpleAdapter adapter;
	private MediaRecorder recorder;

	private static final String RECORD_DIR = "temp_record";
	// 获得存储在外部的路径
	private File dir = new File(Environment.getExternalStorageDirectory(),
			RECORD_DIR);
	private List<Map<String, String>> records = new ArrayList<Map<String, String>>();

	private String currnetPath;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn = (Button) findViewById(R.id.recordBtn);
		lv = (ListView) findViewById(R.id.recordList);
		checkDir();
		adapter = new SimpleAdapter(this, records, R.layout.list_cell,
				new String[] { "name" }, new int[] { R.id.cell_tv });
		refreshAdapter();
		lv.setAdapter(adapter);
		lv.setOnItemClickListener(new OnItemClickListener() {
			@SuppressWarnings("unchecked")
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				Map<String, String> map = (Map<String, String>) adapter
						.getItem(position);
				System.out.println(map);
				final MediaPlayer mp = MediaPlayer.create(MainActivity.this,
						Uri.fromFile(new File(map.get("path"))));
				if(mp==null){
					return;
				}
				mp.start();
				mp.setOnCompletionListener(new OnCompletionListener() {
					@Override
					public void onCompletion(MediaPlayer arg0) {
						mp.release();
					}
				});
			}
		});

		btn.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					recorder = new MediaRecorder();
					// 这边这几个方法调用的顺序不能错
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					// 获得当前存放文件的地址
					currnetPath = getPath();
					recorder.setOutputFile(currnetPath);
					try {
						recorder.prepare();
					} catch (IllegalStateException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
					recorder.start();
					break;
				case MotionEvent.ACTION_UP:
					if (recorder != null) {
						try {
							recorder.stop();
							refreshAdapter();
						} catch (RuntimeException stopException) {
							// 这个异常出现在录制之后马上停止了
							stopException.printStackTrace();
							File file = new File(currnetPath);
							if (file.exists()) {
								// 抛出异常的话就删掉错误的文件
								file.delete();
							}
						}finally{
						recorder.release();
						recorder = null;
						}
					}
					break;
				}
				return false;
			}
		});
	}

	private void checkDir() {
		if (!dir.exists()) {
			dir.mkdir();
		}
	}

	/**
	 * 刷新数据
	 */
	private void refreshAdapter() {
		records.clear();
		for (File file : dir.listFiles()) {
			Map<String, String> map = new HashMap<String, String>();
			map.put("name", file.getName());
			map.put("path", file.getAbsolutePath());
			records.add(map);
		}
		adapter.notifyDataSetChanged();
	}

	@SuppressLint("SimpleDateFormat") private String getPath() {
		String name = new SimpleDateFormat("yyyyMMdd_HHmmss_SS")
				.format(new Date());
		File path = new File(dir, name + ".amr");
		return path.getAbsolutePath();
	}

}


你可能感兴趣的:(android,MediaRecorder,录音)