android进行录音功能并保存播放

原创 2015年11月18日 17:17:17

在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" />   

好了,现在就可以使用了,觉得有用的朋友请点个赞。

demo下载地址:http://download.csdn.net/detail/myname_kk/9280417

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 录音实现方法、仿微信语音、麦克风录音、发送语音、解决5.0以上BUG

本文修改自:http://www.jianshu.com/p/06eca50ddda4 效果图(注!由于使用的模拟器录制,所以图片中的录音时候话筒上下波动比较小,手机上正常!): ...
  • fan7983377
  • fan7983377
  • 2016年06月24日 10:33
  • 21815

Android开发录音和播放音频的步骤(动态获取权限)

步骤 配置权限 代码步骤 步骤: 配置权限: manifest xmlns:android="http://schemas.android.com/apk/res/android" pa...
  • ytfunnysite
  • ytfunnysite
  • 2017年03月16日 11:38
  • 5975

Android6.0源码分析之录音功能(一)

从现在开始一周时间研究录音,下周出来一个完整的博客,监督,激励!!! 2017-02-09--------2017-02-17...
  • zrf1335348191
  • zrf1335348191
  • 2017年02月09日 17:31
  • 8237

Android使用MediaRecorder实现录音及播放

现在项目中有使用到音视频相关技术,在参考了网上各种大牛的资料及根据自己项目实际情况(兼容安卓6.0以上版本动态权限管理等), 把声音录制及播放相关代码做个记录。 public class Medi...
  • true100
  • true100
  • 2017年02月10日 09:52
  • 4505

Android音频框架笔记

Android音频框架笔记 - 上篇     本文转自:http://www.jianshu.com/p/9481b1482367 提醒一下,纯个人笔记,你完全可能看晕 一、音频数字...
  • qq_29028177
  • qq_29028177
  • 2017年05月25日 11:30
  • 1109

Android多媒体学习十:利用AudioRecord类实现自己的音频录制程序

AudioRecord类相对于MediaRecorder来说,更加接近底层,为我们封装的方法也更少。然而实现一个AudioRecord的音频录制程序也很简单。本实例代码如下: 可惜,本实例测试时有个问...
  • chenjie19891104
  • chenjie19891104
  • 2011年04月19日 14:47
  • 50864

Android录音工具类

以下工具类都是经过实战开发验证都是可以直接复制使用的。      录音工具类介绍:      录音工具类主要平时用来开发语音聊天的,在微信和QQ上该工具类都是常用的,因为语音聊天。      使用硬件...
  • SYIF88
  • SYIF88
  • 2016年09月09日 14:14
  • 1162

android 录音绘制波形

csdn的朋友们新年好,也许都还不认识我(呵呵...感觉像是大神一样),已经是做Android的第五年,迈向第六年,新的一年可能会分享很多干货在csdn中,大家多多发表意见。         今天来分...
  • chenzhuo1100
  • chenzhuo1100
  • 2016年02月16日 10:27
  • 9152

Android 录音实现方法、仿微信语音、麦克风录音、发送语音

效果图(注!由于使用的模拟器录制,所以图片中的录音时候话筒上下波动比较小,手机上正常!): 使用方法: 录音工具类:AudioRecoderUtils.java,代码...
  • fengyeNom1
  • fengyeNom1
  • 2017年06月14日 18:49
  • 937

Android音频开发之使用AudioRecord录制

本文主要是记录Android端音频开发 本例记录使用AudioRecord 录制音频,播放使用AudioTrack,存储的文件为pcm 只是简单的测试用例,界面同上文 注意添加权限 1 . ...
  • I_do_can
  • I_do_can
  • 2017年01月02日 10:14
  • 2091
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android进行录音功能并保存播放
举报原因:
原因补充:

(最多只允许输入30个字)