首先是xml布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_talk"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:enabled="false"
        android:text="TALK"
        android:textSize="30dp"
        android:textStyle="bold" />

</LinearLayout>

MainActivity中定义按钮的点击监听器,按下按钮时开始录音,松开按钮时停止录音,类似于微信的操作方法。

	// 获得控件
	public void get_con(){
		
		btn_talk = (Button)findViewById(R.id.btn_talk);
		
		btn_talk.setOnTouchListener(new OnTouchListener(){

			@Override
			public boolean onTouch(View v, MotionEvent e) {

				if (e.getAction() == MotionEvent.ACTION_DOWN){
					// 开始录音
					start_record();
				}
				else if (e.getAction() == MotionEvent.ACTION_UP){
					// 停止录音
					stop_record();
				}
				
				return false;
				
			}
			
		});
		
	}

开始录音的方法,使用了android.media.MediaRecorder录音。首先判断SD卡是否存在,如果存在根据当前时间给创建一个录音文件,保存到预定的目录中,用MediaRecorder类开始录音。

	// 开始录音
	public void start_record(){
		
		if (!Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED)){			
			show_status("SD卡不存在,请插入SD卡!");			
		}
		else{
			try
			{
				// 获取当前时间
				cur_date = new Date(System.currentTimeMillis());
				str_file = formatter.format(cur_date); 
				// 创建保存录音的音频文件
				send_sound_file = new File(Environment
					.getExternalStorageDirectory()
					.getCanonicalFile() + "/talk/send");
				// 如果目录不存在
				if (!send_sound_file.exists()){
					send_sound_file.mkdirs();
				}
				send_sound_file = new File(Environment
						.getExternalStorageDirectory()
						.getCanonicalFile() + "/talk/send/" + str_file + ".amr");
				recorder = new MediaRecorder();
				// 设置录音的声音来源
				recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
				// 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)
				recorder.setOutputFormat(MediaRecorder
					.OutputFormat.THREE_GPP);
				// 设置声音编码的格式
				recorder.setAudioEncoder(MediaRecorder
					.AudioEncoder.AMR_NB);
				recorder.setOutputFile(send_sound_file.getAbsolutePath());
				recorder.prepare();
				// 开始录音
				recorder.start();
			}
			catch (Exception e)
			{
				show_status(e.toString());
			}
		}
		
	}

停止录音的方法,相对简单。

	// 停止录音
	public void stop_record(){
		
		if (send_sound_file != null && send_sound_file.exists())
		{
			ses_id = ses_id + 1;
			// 停止录音
			recorder.stop();
			// 释放资源
			recorder.release();
			recorder = null;
		}
		super.onDestroy();
		
	}

经过实验,录制的3gp文件可以正常播放。

版权声明:本文为mstk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mstk/p/3451560.html