Android 录音与播放功能的简单实例

最近在研究Android中一些常用的功能,像地图、拍照、录音和播放的实现等等,还有一些侧滑、动画等是如何实现的。
今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部的类即可实现。

1、先看下运行后的界面:

以下三张图分别是进入、录音、播放时的。

  Android 录音与播放功能的简单实例_第1张图片Android 录音与播放功能的简单实例_第2张图片Android 录音与播放功能的简单实例_第3张图片

2、Layout布局文件

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

3 Activity类

录音涉及到二个Activity,第一个Activity比较简单,我这里大概说下,其实就是有个按钮,点击后转移第二个Activity,录音返回后,在第一个Activity中获取录音的文件名、时长等。

第一个Activity部分代码:

 // 录音事件   ksly_btn.setOnClickListener(new OnClickListener() {     @Override     public void onClick(View v) {       Intent intent = new Intent(MaintainVisitEditActivity.this, AudioRecordActivity.class);       intent.setAction(Intent.ACTION_VIEW);       intent.putExtra("duration", entity.getVoiceDuration());       intent.putExtra("fileName", entity.getVoiceRecord());       startActivityForResult(intent, VOICE_RECODE);     }   });  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {   super.onActivityResult(requestCode, resultCode, data);    if (requestCode == VOICE_RECODE && resultCode == AudioRecordActivity.SUCCESS) {     entity.setVoiceDuration(data.getLongExtra("duration", 0));// 时长     entity.setVoiceRecord(data.getStringExtra("fileName"));// 文件名(绝对路径)     ksly_time.setText(DateTimeUtils.formatToMillisecond(entity.getVoiceDuration()));   } } 

第二个Activity代码:

这里要注意一下,就是需要捕获返回键,处理一下,就是点击返回键时,也返回个状态码,以表示没有录音成功。

package com.whowii.ct.cm.activity;  import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;  import android.app.Activity; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;  import com.whowii.ct.cm.R; import com.whowii.ct.cm.command.QueryParams; import com.whowii.ct.cm.utils.DateTimeUtils; import com.whowii.ct.cm.utils.SDCardUtils;  /**  * 录制音频  *  * @author Administrator  *  */ public class AudioRecordActivity extends Activity {   private TextView audio_record_time;   private Button audio_record_start, audio_record_stop, audio_record_play, audio_record_select;   private MediaRecorder mediaRecorder;   private final String TAG = AudioRecordActivity.class.getSimpleName();   private boolean isIdle = true;// 当前是否空闲,false:表示正在录音   private long startTime = 0, stopTime = 0, duration = 0;// 开始时间、结束时间、录音时长   private String fileName = null;// 存储录音文件的路径   private Timer timer = null;// Timer计时器   public static final int SUCCESS = 1;// 录制成功;   public static final int FAILURE = 0;// 录制失败   private MediaPlayer mediaPlayer;   private TimerTask task = new TimerTask() {     final Handler handler = new Handler() {       public void handleMessage(Message message) {         Bundle data = message.getData();         audio_record_time.setText(DateTimeUtils.formatToMillisecond(data.getLong("time")));       }     };      public void run() {       Message message = new Message();       long t = System.currentTimeMillis();       Bundle data = new Bundle();       data.putLong("time", t - startTime);       message.setData(data);       handler.sendMessage(message);     }   };    protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置无标题栏      setContentView(R.layout.audio_record);     mediaPlayer = new MediaPlayer();      initControl();     setListener();      timer = new Timer(true);     fileName = getIntent().getStringExtra("fileName");     duration = getIntent().getLongExtra("duration", 0);   }    private void initControl() {     audio_record_time = (TextView) findViewById(R.id.audio_record_time);     audio_record_start = (Button) findViewById(R.id.audio_record_start);     audio_record_stop = (Button) findViewById(R.id.audio_record_stop);     audio_record_play = (Button) findViewById(R.id.audio_record_play);     audio_record_select = (Button) findViewById(R.id.audio_record_select);   }    private void setListener() {     // 播放完成事件     mediaPlayer.setOnCompletionListener(new OnCompletionListener() {       @Override       public void onCompletion(MediaPlayer mp) {         isIdle = true;         audio_record_play.setText("播放录音");         audio_record_play.setBackgroundResource(R.drawable.searchinput_bg);       }     });     // 开始录音     audio_record_start.setOnClickListener(new OnClickListener() {       @Override       public void onClick(View v) {         if (!isIdle) {           return;         }         if (!SDCardUtils.sdCardExists()) {           Toast.makeText(AudioRecordActivity.this, "缺少SD卡,请先插入后再操作!", Toast.LENGTH_LONG).show();           return;         }         audio_record_start.setText("开始录音");         audio_record_start.setEnabled(true);          duration = 0;         startTime = System.currentTimeMillis();         fileName = QueryParams.CACHE_AUDIO_PATH;         fileName += new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date(startTime)) + ".amr";         File file = new File(fileName);          mediaRecorder = new MediaRecorder();         mediaRecorder.setOutputFile(file.getAbsolutePath());         mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);         mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);         mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);         try {           mediaRecorder.prepare();           mediaRecorder.start();           isIdle = false;           audio_record_start.setBackgroundResource(R.drawable.searchbtn_pressed);           timer.schedule(task, 0, 100);         } catch (IOException e) {           startTime = 0;           Log.e(TAG, e.toString());           Toast.makeText(AudioRecordActivity.this, "录制时发生异常!", Toast.LENGTH_LONG).show();         }       }     });     // 结束录音     audio_record_stop.setOnClickListener(new OnClickListener() {       @Override       public void onClick(View v) {         if (mediaRecorder != null) {           stopTime = System.currentTimeMillis();           duration = stopTime - startTime;           timer.cancel();           mediaRecorder.stop();           mediaRecorder.release();           mediaRecorder = null;           audio_record_start.setBackgroundResource(R.drawable.searchbtn_normal);           isIdle = true;         }       }     });     // 播放录音     audio_record_play.setOnClickListener(new OnClickListener() {       @Override       public void onClick(View v) {         if (!isIdle) {           return;         }          if (audio_record_play.getText().equals("播放录音")) {           if (fileName == null || fileName.equals("") || duration == 0) {             Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show();             return;           }            try {             mediaPlayer.reset();             mediaPlayer.setDataSource(fileName);             mediaPlayer.prepare();             mediaPlayer.start();             isIdle = false;             audio_record_play.setText("终止播放");             audio_record_play.setBackgroundResource(R.drawable.searchbtn_pressed);           } catch (Exception e) {             e.printStackTrace();             Toast.makeText(AudioRecordActivity.this, "播放录音时遇到错误!", Toast.LENGTH_LONG).show();           }         } else {           if (mediaPlayer != null && mediaPlayer.isPlaying()) {             mediaPlayer.stop();             isIdle = true;           }           audio_record_play.setText("播放录音");           audio_record_play.setBackgroundResource(R.drawable.searchinput_bg);         }       }     });     // 确认选择     audio_record_select.setOnClickListener(new OnClickListener() {       @Override       public void onClick(View v) {         if (fileName == null || fileName.equals("") || duration == 0) {           Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show();           return;         }          Intent intent = new Intent();         intent.putExtra("fileName", fileName);         intent.putExtra("duration", duration);         setResult(SUCCESS, intent);// 返回成功标识         isIdle = true;         if (mediaPlayer != null) {           if (mediaPlayer.isPlaying()) {             mediaPlayer.stop();           }           mediaPlayer = null;         }         finish();// 结束当前的activity,等于点击返回按钮       }     });   }    // 捕获返回键,关闭当前页面时返回失败标识   @Override   public boolean onKeyDown(int keyCode, KeyEvent event) {     if (keyCode == KeyEvent.KEYCODE_BACK) {       setResult(FAILURE);       isIdle = true;       if (mediaPlayer != null) {         if (mediaPlayer.isPlaying()) {           mediaPlayer.stop();         }         mediaPlayer = null;       }       finish();       return true;     }     return super.onKeyDown(keyCode, event);   }  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. android之AIDL实例详解
  2. QtAndroid详解(4):JNI调用Android系统功能(1)
  3. Android 开发之旅:深入分析布局文件&又是“Hello World!”
  4. Android res/raw文件;raw与res/assets异同
  5. android 增加物理按键关闭wifi实例讲解
  6. 【经验小谈】androidx86虚拟机跟intel-vt冲突 android x86虚拟机
  7. Chrome for Android 也将具备 Opera Mobile 和 Amazon Silk 那种
  8. 全面的Android文件目录解析和获取方法(包含对6.0系统的说明)
  9. Android开发实例之多点触控程序

随机推荐

  1. phpcms v9访问单网页一级栏目自动跳转到
  2. eclipse 编写php错误
  3. phpBB3导入帖子的Python脚本
  4. 如何将Composer中的CakePHP插件安装到app
  5. 如何使用background-image:用php
  6. 在Apache及IIS6.0中codeigniter去掉 URL
  7. php面向对象之抽象类和接口理解
  8. Thinkphp 使用原生类
  9. 如果db query A没有返回足够的结果,请运行
  10. PHP基础之脚本传参