Android编程实现录音及保存播放功能的方法【附demo源码下载】

 更新时间:2018年01月29日 13:57:58   作者:总有刁民想爱朕  
这篇文章主要介绍了Android编程实现录音及保存播放功能的方法,结合实例形式分析了Android基于MediaRecorder类进行录音机保存播放功能的相关操作技巧,并附带demo源码供读者下载,需要的朋友可以参考下

本文实例讲述了Android编程实现录音及保存播放功能的方法。分享给大家供大家参考,具体如下:

在android中进行录音相对来说是比较简单的,使用系统提供的MediaRecorder类进行录音并保存,然后调用MediaPlayer进行播放。以下为xml配置文件代码:

<RelativeLayout 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"
  tools:context="com.example.kk.soundrecording.MainActivity" >
  <Button
    android:id="@+id/start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/start" />
  <Button
    android:id="@+id/stop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/start"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/stop" />
  <Button
    android:id="@+id/paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/stop"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/paly" />
  <Button
    android:id="@+id/pause_paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/paly"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/pause_paly" />
  <Button
    android:id="@+id/stop_paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/pause_paly"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/stop_paly" />
</RelativeLayout>

在MainActivity中进行录音,代码如下:

package com.example.kk.soundrecording;
import java.io.File;
import java.io.IOException;
import com.example.kk.util.RecordPlayer;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 *
 * @author kk
 *
 */
public class MainActivity extends Activity implements OnClickListener {
  // 开始录音
  private Button start;
  // 停止按钮
  private Button stop;
  // 播放按钮
  private Button paly;
  // 暂停播放
  private Button pause_paly;
  // 停止播放
  private Button stop_paly;
  // 录音类
  private MediaRecorder mediaRecorder;
  // 以文件的形式保存
  private File recordFile;
  private RecordPlayer player;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recordFile = new File("/mnt/sdcard", "kk.amr");
    initView();
    Listener();
  }
  private void initView() {
    start = (Button) findViewById(R.id.start);
    stop = (Button) findViewById(R.id.stop);
    paly = (Button) findViewById(R.id.paly);
    pause_paly = (Button) findViewById(R.id.pause_paly);
    stop_paly = (Button) findViewById(R.id.stop_paly);
  }
  private void Listener() {
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
    paly.setOnClickListener(this);
    pause_paly.setOnClickListener(this);
    stop_paly.setOnClickListener(this);
  }
  @Override
  public void onClick(View v) {
    player = new RecordPlayer(MainActivity.this);
    int Id = v.getId();
    switch (Id) {
    case R.id.start:
      startRecording();
      break;
    case R.id.stop:
      stopRecording();
      break;
    case R.id.paly:
      playRecording();
      break;
    case R.id.pause_paly:
      pauseplayer();
      break;
    case R.id.stop_paly:
      stopplayer();
      break;
    }
  }
  private void startRecording() {
    mediaRecorder = new MediaRecorder();
    // 判断,若当前文件已存在,则删除
    if (recordFile.exists()) {
      recordFile.delete();
    }
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    mediaRecorder.setOutputFile(recordFile.getAbsolutePath());
    try {
      // 准备好开始录音
      mediaRecorder.prepare();
      mediaRecorder.start();
    } catch (IllegalStateException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  private void stopRecording() {
    if (recordFile != null) {
      mediaRecorder.stop();
      mediaRecorder.release();
    }
  }
  private void playRecording() {
    player.playRecordFile(recordFile);
  }
  private void pauseplayer() {
    player.pausePalyer();
  }
  private void stopplayer() {
    // TODO Auto-generated method stub
    player.stopPalyer();
  }
}

同时,新建一个RecordPlayer类,用来播放保存好的录音,如下:

package com.example.kk.util;
import java.io.File;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
import com.example.kk.soundrecording.R;
/**
 *
 *
 * @author kk  录音播放类
 *
 */
public class RecordPlayer {
  private static MediaPlayer mediaPlayer;
  private Context mcontext;
  public RecordPlayer(Context context) {
    this.mcontext = context;
  }
  // 播放录音文件
  public void playRecordFile(File file) {
    if (file.exists() && file != null) {
      if (mediaPlayer == null) {
        Uri uri = Uri.fromFile(file);
        mediaPlayer = MediaPlayer.create(mcontext, uri);
      }
      mediaPlayer.start();
      //监听MediaPlayer播放完成
      mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer paramMediaPlayer) {
          // TODO Auto-generated method stub
          //弹窗提示
          Toast.makeText(mcontext,
              mcontext.getResources().getString(R.string.ok),
              Toast.LENGTH_SHORT).show();
        }
      });
    }
  }
  // 暂停播放录音
  public void pausePalyer() {
    if (mediaPlayer.isPlaying()) {
      mediaPlayer.pause();
      Log.e("TAG", "暂停播放");
    }
  }
  // 停止播放录音
  public void stopPalyer() {
    // 这里不调用stop(),调用seekto(0),把播放进度还原到最开始
    if (mediaPlayer.isPlaying()) {
      mediaPlayer.pause();
      mediaPlayer.seekTo(0);
      Log.e("TAG", "停止播放");
    }
  }
}

此时,功能代码都已实现,但是运行时会报错!为什么呢,这个是被很多初学者会忘记的,那就是android开发中调用相应的功能时,必须在主配置文件中授予相应的权限,在配置文件中添加如下代码:

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

另外,Android权限控制的详细说明可以参考Android Manifest功能与权限描述大全

附:Demo源码点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • Android自定义LocationMarker的实现详解

    Android自定义LocationMarker的实现详解

    这篇文章主要为大家详细介绍一个比较简单的东西:自定义绘制Marker 其实就是自定义view, 跟轨迹没太多关联,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-02-02
  • Android的支付密码输入框实现浅析

    Android的支付密码输入框实现浅析

    现在有很多的应用都有支付密码功能,而支付密码的密码输入框确实一个很好玩的控件。虽然网上有很多例子,但是抽时间自己设计一个未尝不可啊,下面来一起看看吧,有需要的朋友们可以参考学习。
    2016-09-09
  • Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法

    Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法

    今天小编就为大家分享一篇Android6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android开发之滑动图片轮播标题焦点

    Android开发之滑动图片轮播标题焦点

    这篇文章主要介绍了Android开发之滑动图片轮播标题焦点的相关资料,需要的朋友可以参考下
    2016-05-05
  • Android自定义attr的各种坑

    Android自定义attr的各种坑

    开发过程中经常会自定义View来实现各种各样炫酷的效果,在实现这些效果的同时,我们往往会定义很多attr属性这篇文章主要介绍了Android自定义attr的各种坑,需要的朋友可以参考下
    2016-04-04
  • Android 动画实现几种方案

    Android 动画实现几种方案

    这篇文章主要介绍了Android 动画实现几种方案的相关资料,需要的朋友可以参考下
    2017-06-06
  • 利用MVC编写广告条轮播效果

    利用MVC编写广告条轮播效果

    这篇文章主要为大家详细介绍了利用MVC编写广告条轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 用MOB实例开发实现短信验证功能

    用MOB实例开发实现短信验证功能

    本篇文章通学习通过MOB平台开发APP实现简单的短信验证功能,对此有需求的朋友跟着好好学习下吧。
    2018-01-01
  • Kotlin协程flowOn与线程切换超详细示例介绍

    Kotlin协程flowOn与线程切换超详细示例介绍

    这篇文章主要介绍了Kotlin协程flowOn与线程切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Android适配底部虚拟按键的方法详解

    Android适配底部虚拟按键的方法详解

    今天小编就为大家分享一篇Android适配底部虚拟按键的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论