Android简易录音器——实现录音和播放功能

转载说明出处:http://blog.csdn.net/toolz/article/details/52053671

实现功能主要使用到了Android中的——AudioRecord与MediaRecorder


AudioRecord参考资料:http://www.cnblogs.com/over140/archive/2011/05/31/2063969.html

MediaRecorder参考资料:http://www.myexception.cn/mobile/1629184.html


源码:http://download.csdn.net/detail/toolz/9588503


功能描述:

1、点击开始录音按钮,进入录音状态同时录音按钮文字变为停止录音,点击停止录音,保存音频文件。

2、点击开始播放按钮,进入播放录音状态同时文字变为停止播放。


注意:我再夜神模拟器上面测试不成功,后来转向了手机。建议使用真机测试!


效果图:

<效果>


大致代码如下:

MainActivity.java

package com.toolz.simplerecorderdemo;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/**
 * 简易录音主类,主要负责开始录音,停止录音,播放录音,停止播放功能
 * 
 * @author toolz
 */
public class MainActivity extends Activity implements OnClickListener {

	private Button mBtnRecording;// 录音按钮
	private Button mBtnPlay;// 播放按钮
	private boolean mIsRecordingState = false;// 是否是录音状态
	private boolean mIsPlayState = false;// 是否是播放状态
	private MediaRecorder mRecorder = null;// 录音操作对象
	private MediaPlayer mPlayer = null;// 媒体播放器对象
	private String mFileName = null;// 录音存储路径
	private String TAG = getClass().getSimpleName();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		click();
	}

	private void initView() {
		mBtnRecording = (Button) findViewById(R.id.btn_recording);
		mBtnPlay = (Button) findViewById(R.id.btn_play);
		// 设置sdcard的路径
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
			mFileName += "/wohaoshuai.3gp";
		}
	}

	private void click() {
		mBtnRecording.setOnClickListener(this);
		mBtnPlay.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_recording:
			// 判断录音按钮的状态,根据相应的状态处理事务
			mBtnRecording.setText(R.string.wait_for);
			mBtnRecording.setEnabled(false);
			if (mIsRecordingState) {
				stopRecording();
				mBtnRecording.setText(R.string.start_recording);
			} else {
				startRecording();
				mBtnRecording.setText(R.string.stop_recording);
			}
			mIsRecordingState = !mIsRecordingState;
			mBtnRecording.setEnabled(true);
			break;
		case R.id.btn_play:
			// 判断播放按钮的状态,根据相应的状态处理事务
			mBtnPlay.setText(R.string.wait_for);
			mBtnPlay.setEnabled(false);
			if (mIsPlayState) {
				stopPlay();
				mBtnPlay.setText(R.string.start_play);
			} else {
				startPlay();
				mBtnPlay.setText(R.string.stop_play);
			}
			mIsPlayState = !mIsPlayState;
			mBtnPlay.setEnabled(true);
			break;

		default:
			break;
		}
	}

	/**
	 * 开始录音
	 */
	private void startRecording() {
		mRecorder = new MediaRecorder();
		// 设置声音来源
		mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
		// 设置所录制的音视频文件的格式。(3gp)
		mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
		// 设置录制的音频文件的保存位置。
		if (mFileName == null) {
			Toast.makeText(getApplicationContext(), R.string.no_sd, Toast.LENGTH_SHORT).show();
		} else {
			mRecorder.setOutputFile(mFileName);
			Log.d(TAG, mFileName);
		}
		// 设置所录制的声音的编码格式。
		mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
		try {
			mRecorder.prepare();
		} catch (Exception e) {
			Log.e(TAG, getString(R.string.e_recording));
		}
		mRecorder.start();// 开始录音
	}

	/**
	 * 停止录音
	 */
	private void stopRecording() {
		mRecorder.stop();
		mRecorder.release();
		mRecorder = null;
	}

	/**
	 * 开始播放
	 */
	private void startPlay() {
		mPlayer = new MediaPlayer();
		try {
			mPlayer.setDataSource(mFileName);// 设置多媒体数据来源
			mPlayer.prepare();
			mPlayer.start();
		} catch (IOException e) {
			Log.e(TAG, getString(R.string.e_play));
		}
		// 播放完成,改变按钮状态
		mPlayer.setOnCompletionListener(new OnCompletionListener() {

			@Override
			public void onCompletion(MediaPlayer mp) {
				mIsPlayState = !mIsPlayState;
				mBtnPlay.setText(R.string.start_play);
			}
		});
	}

	/**
	 * 停止播放
	 */
	private void stopPlay() {
		mPlayer.release();
		mPlayer = null;
	}

}


activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btn_recording"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/start_recording" />
    
    <Button
        android:id="@+id/btn_play"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/start_play" />

</LinearLayout>



strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SimpleRecorder</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="start_recording">开始录音</string>
    <string name="stop_recording">停止录音</string>
    <string name="start_play">开始播放</string>
    <string name="stop_play">停止播放</string>
    <string name="wait_for">请稍后...</string>
    <string name="no_sd">SD卡找不到!</string>
    <string name="e_recording">录音准备出现异常!</string>
    <string name="e_play">播放失败!</string>

</resources>

权限:

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




  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值