android MediaRecorder录音

来源:互联网 发布:土耳其语 知乎 编辑:程序博客网 时间:2024/05/22 14:18

录音相关权限

    <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;@Overrideprotected 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")@Overridepublic 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() {@Overridepublic void onCompletion(MediaPlayer arg0) {mp.release();}});}});btn.setOnTouchListener(new OnTouchListener() {@Overridepublic 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();}}


0 0