先布局一个button点击录音
然后一个listview显示录音
package jz.com.myapplication;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 实现按住说话功能
* 按住说话,开始录音,停止录音,显示到列表,点击列表项播放。
*/
public class MainActivity extends AppCompatActivity {
/**
* log标记
*/
private static final String LOG_TAG = "MainActivity";
/**
* 语音文件保存路径
*/
private String mFileName = null;
/**
* 按住说话按钮
*/
private Button mBtnVoice;
/**
* 用于语音播放
*/
private MediaPlayer mPlayer = null;
/**
* 用于完成录音
*/
private MediaRecorder mRecorder = null;
/**
* 显示语音列表
*/
private ListView mVoidListView;
/**
* 语音列表适配器
*/
private MyListAdapter mAdapter;
/**
* 语音列表
*/
private List<String> mVoicesList;
/**
* 录音存储路径
*/
private static final String PATH = "/sdcard/MyVoiceForder/Record/";
long time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/**
* 初始化控件
*/
private void initView() {
mVoidListView = (ListView) findViewById(R.id.voidList);
mAdapter = new MyListAdapter(this);
mVoidListView.setAdapter(mAdapter);
mVoidListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
try {
mPlayer.reset(); //装在下一首音频
mPlayer.setDataSource(mVoicesList.get(position)); //准备声音
mPlayer.prepare(); //准备音频
mPlayer.start(); //开始播放
Log.e(LOG_TAG, "播放成功");
} catch (IOException e) {
Log.e(LOG_TAG, "播放失败");
}
}
});
mBtnVoice = (Button) findViewById(R.id.btn_voice);
mBtnVoice.setText("按住说话");
mBtnVoice.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(LOG_TAG, "开始录音");
if (time == 0) {
time = System.currentTimeMillis();
}
startVoice();
break;
case MotionEvent.ACTION_UP:
Log.i(LOG_TAG, "停止录音");
stopVoice();
break;
default:
break;
}
return false;
}
});
}
/**
* 初始化数据
*/
private void initData() {
mVoicesList = new ArrayList<String>();
mPlayer = new MediaPlayer();
}
/**
* 开始录音
*/
private void startVoice() {
// 设置录音保存路径
mFileName = PATH + UUID.randomUUID().toString() + ".amr";
Log.i("录音保存的路径", mFileName.toString());
String state = android.os.Environment.getExternalStorageState(); //判断sd卡存在
if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
Log.i(LOG_TAG, "SD Card is not mounted,It is " + state + ".");
}
File directory = new File(mFileName).getParentFile();
if (!directory.exists() && !directory.mkdirs()) {
Log.i(LOG_TAG, "Path to file could not be created");
}
Toast.makeText(getApplicationContext(), "开始录音", Toast.LENGTH_LONG).show();
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}
/**
* 停止录音
*/
private void stopVoice() {
if (mRecorder != null) {
mRecorder.stop(); //停止录制
mRecorder.release(); //释放资源
mRecorder = null;
mVoicesList.add(mFileName);
mAdapter = new MyListAdapter(MainActivity.this);
mVoidListView.setAdapter(mAdapter);
Toast.makeText(getApplicationContext(), "保存录音" + mFileName, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "录音时间过短", Toast.LENGTH_SHORT).show();
}
}
/**
* 语音列表适配器
*/
private class MyListAdapter extends BaseAdapter {
LayoutInflater mInflater;
public MyListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mVoicesList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("适配器的getView", "getView");
convertView = mInflater.inflate(R.layout.item_voicelist, null);
TextView tv = (TextView) convertView.findViewById(R.id.tv_armName);
tv.setText(mVoicesList.get(position));
return convertView;
}
}
}
然后一个listview显示录音
package jz.com.myapplication;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 实现按住说话功能
* 按住说话,开始录音,停止录音,显示到列表,点击列表项播放。
*/
public class MainActivity extends AppCompatActivity {
/**
* log标记
*/
private static final String LOG_TAG = "MainActivity";
/**
* 语音文件保存路径
*/
private String mFileName = null;
/**
* 按住说话按钮
*/
private Button mBtnVoice;
/**
* 用于语音播放
*/
private MediaPlayer mPlayer = null;
/**
* 用于完成录音
*/
private MediaRecorder mRecorder = null;
/**
* 显示语音列表
*/
private ListView mVoidListView;
/**
* 语音列表适配器
*/
private MyListAdapter mAdapter;
/**
* 语音列表
*/
private List<String> mVoicesList;
/**
* 录音存储路径
*/
private static final String PATH = "/sdcard/MyVoiceForder/Record/";
long time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/**
* 初始化控件
*/
private void initView() {
mVoidListView = (ListView) findViewById(R.id.voidList);
mAdapter = new MyListAdapter(this);
mVoidListView.setAdapter(mAdapter);
mVoidListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
try {
mPlayer.reset(); //装在下一首音频
mPlayer.setDataSource(mVoicesList.get(position)); //准备声音
mPlayer.prepare(); //准备音频
mPlayer.start(); //开始播放
Log.e(LOG_TAG, "播放成功");
} catch (IOException e) {
Log.e(LOG_TAG, "播放失败");
}
}
});
mBtnVoice = (Button) findViewById(R.id.btn_voice);
mBtnVoice.setText("按住说话");
mBtnVoice.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(LOG_TAG, "开始录音");
if (time == 0) {
time = System.currentTimeMillis();
}
startVoice();
break;
case MotionEvent.ACTION_UP:
Log.i(LOG_TAG, "停止录音");
stopVoice();
break;
default:
break;
}
return false;
}
});
}
/**
* 初始化数据
*/
private void initData() {
mVoicesList = new ArrayList<String>();
mPlayer = new MediaPlayer();
}
/**
* 开始录音
*/
private void startVoice() {
// 设置录音保存路径
mFileName = PATH + UUID.randomUUID().toString() + ".amr";
Log.i("录音保存的路径", mFileName.toString());
String state = android.os.Environment.getExternalStorageState(); //判断sd卡存在
if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
Log.i(LOG_TAG, "SD Card is not mounted,It is " + state + ".");
}
File directory = new File(mFileName).getParentFile();
if (!directory.exists() && !directory.mkdirs()) {
Log.i(LOG_TAG, "Path to file could not be created");
}
Toast.makeText(getApplicationContext(), "开始录音", Toast.LENGTH_LONG).show();
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}
/**
* 停止录音
*/
private void stopVoice() {
if (mRecorder != null) {
mRecorder.stop(); //停止录制
mRecorder.release(); //释放资源
mRecorder = null;
mVoicesList.add(mFileName);
mAdapter = new MyListAdapter(MainActivity.this);
mVoidListView.setAdapter(mAdapter);
Toast.makeText(getApplicationContext(), "保存录音" + mFileName, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "录音时间过短", Toast.LENGTH_SHORT).show();
}
}
/**
* 语音列表适配器
*/
private class MyListAdapter extends BaseAdapter {
LayoutInflater mInflater;
public MyListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mVoicesList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("适配器的getView", "getView");
convertView = mInflater.inflate(R.layout.item_voicelist, null);
TextView tv = (TextView) convertView.findViewById(R.id.tv_armName);
tv.setText(mVoicesList.get(position));
return convertView;
}
}
}