欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 之 MeidaRedoreder实现音频录制

程序员文章站 2022-05-16 16:45:34
...
调用系统自带的程序进行音频的录制:
package com.example.media_record;

import android.app.Activity;

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/* 使用自带的音频录制程序
 * 利用MediaRecorder 类实现自己的音频录制程序,也可以录制视频;
 * 创建实例后,调用:
 * 			1、setAudioSource  初始化
 * 			2、setOuputFormat	音频格式
 * 			3、setAudioEncoder 初始化;
 * 			4、setOutputFile() 指定存放录制内容的文件;
 * 
 * */
public class MainActivity extends Activity {

	private Button system_record,custom_media,custom_audio;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		/* 获取组件对象,并且设置事件监听 */
		system_record = (Button) findViewById(R.id.system_mediaRecord);
		custom_media = (Button) findViewById(R.id.custom_mediaRecord);
		custom_audio = (Button) findViewById(R.id.custom_audioRecord);
		
		/* 设置事件监听 */
		system_record.setOnClickListener(listener);
		custom_audio.setOnClickListener(listener);
		custom_media.setOnClickListener(listener);
		
	}

	/* 覆盖该方法,接收数据 *//*  这里获取录制到的音频的Uri, 可以进行播放等操作 */
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		if(requestCode == RESULT_OK){
			Uri audioPath = data.getData();
			MediaPlayer mediaPlayer = MediaPlayer.create(this, audioPath);
			mediaPlayer.start();
			Toast.makeText(MainActivity.this, audioPath.toString(), 1000).show();
		}
	}
		
	/* 设置按钮事件监听器 */
	OnClickListener listener = new OnClickListener() {
		
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch(v.getId()){
			case R.id.system_mediaRecord:
				/* 调用Android自带的音频录制程序 */
				Intent intent1= new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
				startActivityForResult(intent1, 0);
				
				break;
			case R.id.custom_mediaRecord:
				
				/* 通过MediaRecorder 类实现自己的音频录制程序 */
				Intent intent2 = new Intent();
				intent2.setClass(MainActivity.this,MyMediarRecorder.class);
				startActivityForResult(intent2, 1);
				
				break;
			case R.id.custom_audioRecord:
				
				/* 通过AudioRecord类实现自己的音频录制程序 */
				Intent intent3 = new Intent();
				intent3.setClass(MainActivity.this, MyAudioRecord.class);
				startActivityForResult(intent3, 2);
				break;
			}
		}
	};
	


}



使用MediaRecoreder实现音频录制:

package com.example.media_record;
import java.io.File;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
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.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/* 启动自定义的音频录制程序来完成录制的工作
 * 
 *  权限: 为了可以录制音频需要:RECORD_AUDIO权限
 *  权限:为了可以写入SDCard,需要:WRITE_EXTERNAL_STORAGE权限;
 *  
 *  */
public class MyMediarRecorder extends Activity {

	private TextView stateView;
	private Button start,stop,play,finish;
	private MediaRecorder recorder;
	private File audioFile;
	private Uri fileUri;
	private MediaPlayer mediaPlayer;
	
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.media_recorder_layout);

		/* 获取组件对象 */
		stateView = (TextView) findViewById(R.id.stateView);
		start = (Button) findViewById(R.id.start);
		stop = (Button) findViewById(R.id.stop);
		play = (Button) findViewById(R.id.play);
		finish = (Button) findViewById(R.id.finish);
		
		start.setOnClickListener(listener);
		stop.setOnClickListener(listener);
		play.setOnClickListener(listener);
		finish.setOnClickListener(listener);

		stop.setEnabled(false);
		play.setEnabled(false);

	}

	/* 事件:处理用户的动作  */
	OnClickListener listener = new OnClickListener() {

		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.start:

				/* 开始录制 *//* 需要一个MediaRecorder对象 */
				recorder = new MediaRecorder();

				/* 指定MIC(Microphone audio source) */
				recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

				/* 指定音频文件保存的格式 */
				/* THREE_GPP: 录制后文件是一个3gp 文件,支持视频和音频录制 */
				recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

				/* 指定Audio 编码方式,目前只有AMR_NB格式 */
				recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

				/* 指定录制文件的存储路径 */
				File fpath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");

				/* 创建文件夹 */
				fpath.mkdirs();

				try{
					/* 创建临时文件  *//* 参数:前缀 ,后缀,目录地址 */
					audioFile = File.createTempFile("recording", ".3gp", fpath);
				}catch(Exception ex){
					Toast.makeText(MyMediarRecorder.this, "临时文件创建失败", 1000).show();
				}

				/* 设置文件的存储位置 */
				recorder.setOutputFile(audioFile.getAbsolutePath());

				/* 开始录制 */
				try{
					/* 准备 */
					recorder.prepare();
				}catch(Exception ex){
					Toast.makeText(MyMediarRecorder.this, "录音失败", 1000).show();
				}

				/* 开始 */
				recorder.start();
				stateView.setText("正在录制...");
				start.setEnabled(false);
				play.setEnabled(false);
				stop.setEnabled(true);

				break;

				/*********************************************************/	
			case R.id.stop:

				/* 停止录制 */
				recorder.stop();

				/* 释放资源 */
				recorder.release();

				/* 然后将录制的文件存储在MediaStore中 ,实现数据共享*/
				ContentValues values = new  ContentValues();
				values.put(MediaStore.Audio.Media.TITLE, "this is my first recored_audio");
				values.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis());
				values.put(MediaStore.Audio.Media.DATA, audioFile.getAbsolutePath());

				/* 获取插入数据的Uri */
				fileUri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);

				/* 录制结束后 ,实例化一个MediaPlayer对象,播放*/
				mediaPlayer = new MediaPlayer();
				mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
					public void onCompletion(MediaPlayer mp) {

						/* 更新状态 */
						stateView.setText("准备录制...");
						play.setEnabled(true);
						start.setEnabled(true);
						stop.setEnabled(false);
					}
				});

				/* 准备播放 */
				try{
					mediaPlayer.setDataSource(audioFile.getAbsolutePath());
					mediaPlayer.prepare();
					
				}catch(Exception ex){
					
				}
				
				/* 更新状态 */
				stateView.setText("准备播放");
				play.setEnabled(true);
				start.setEnabled(true);
				stop.setEnabled(false);

				break;

			case R.id.play:
				
				/* 播放录音 *//* 在录音结束的时候,已经实例化了MediaPlayer , 做好了播放的准备 */
				mediaPlayer.start();
				
				/* 更新状态 */
				stateView.setText("正在播放");
				start.setEnabled(false);
				stop.setEnabled(false);
				play.setEnabled(false);
				
				
				break;

			case R.id.finish:
				
				/* 完成录制,返回录制的音频的Uri */
				Intent intent = new Intent();
				intent.setData(fileUri);
				this.setResult(RESULT_OK,intent);
				this.finish();
				
				break;
			default:
				break;
			}

		}

		private void finish() {
			// TODO Auto-generated method stub
			
		}

		private void setResult(int resultOk, Intent intent) {
			// TODO Auto-generated method stub
			
		}
	};

}