原文:http://www.jb51.net/article/46182.htm

Android音频录制MediaRecorder之简易的录音软件实现代码

这篇文章主要介绍了Android音频录制MediaRecorder之简易的录音软件实现代码,有需要的朋友可以参考一下

使用MediaRecorder的步骤:
1、创建MediaRecorder对象
2、调用MediRecorder对象的setAudioSource()方法设置声音的来源,一般传入MediaRecorder.MIC
3、调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式
4、调用MediaRecorder对象的setAudioRncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamlingRate(int SamplingRate)设置所录音的编码格式、编码位率、采样率等,
5、调用MediaRecorder对象的setOutputFile(String path)方法设置录制的音频文件的保存位置
6、调用MediaRecoder对象的Prepare()方法准备录制
7、调用MediaRecoder对象的start()方法开始录制
8、调用MediaRecoder对象的stop()方法停止录制,并调用release()方法释放资源

实例:

复制代码代码如下:
    <uses-permission  android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission  android:name="android.permission.RECORD_AUDIO"/>
复制代码代码如下:
<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=".MainActivity" >

<LinearLayout 
        android:id="@+id/li1"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button android:id="@+id/start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/start"/>
         <Button android:id="@+id/stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/stop"/>
    </LinearLayout>
    <ListView 
        android:id="@+id/list"
        android:layout_below="@id/li1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>

</RelativeLayout>

复制代码代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/show_file_name" />

<Button
        android:id="@+id/bt_list_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="@string/play"/>
    <Button  android:id="@+id/bt_list_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="@string/list_stop"/>

</LinearLayout>

复制代码代码如下:
package com.android.xiong.mediarecordertest;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

private Button start;
 private Button stop;
 private ListView listView;
 // 录音文件播放
 private MediaPlayer myPlayer;
 // 录音
 private MediaRecorder myRecorder;
 // 音频文件保存地址
 private String path;
 private String paths = path;
 private File saveFilePath;
 // 所录音的文件
 String[] listFile = null;

ShowRecorderAdpter showRecord;
 AlertDialog aler = null;

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  start = (Button) findViewById(R.id.start);
  stop = (Button) findViewById(R.id.stop);
  listView = (ListView) findViewById(R.id.list);
  myPlayer = new MediaPlayer();
  myRecorder = new MediaRecorder();
  // 从麦克风源进行录音
  myRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
  // 设置输出格式
  myRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
  // 设置编码格式
  myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  showRecord = new ShowRecorderAdpter();
  if (Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED)) {
   try {
    path = Environment.getExternalStorageDirectory()
      .getCanonicalPath().toString()
      + "/XIONGRECORDERS";
    File files = new File(path);
    if (!files.exists()) {
     files.mkdir();
    }
    listFile = files.list();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

start.setOnClickListener(this);
  stop.setOnClickListener(this);
  if (listFile != null) {
   listView.setAdapter(showRecord);
  }

}

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

class ShowRecorderAdpter extends BaseAdapter {

@Override
  public int getCount() {
   return listFile.length;
  }

@Override
  public Object getItem(int arg0) {
   return arg0;
  }

@Override
  public long getItemId(int arg0) {
   return arg0;

}

@Override
  public View getView(final int postion, View arg1, ViewGroup arg2) {
   View views = LayoutInflater.from(MainActivity.this).inflate(
     R.layout.list_show_filerecorder, null);
   TextView filename = (TextView) views
     .findViewById(R.id.show_file_name);
   Button plays = (Button) views.findViewById(R.id.bt_list_play);
   Button stop = (Button) views.findViewById(R.id.bt_list_stop);

filename.setText(listFile[postion]);
   // 播放录音
   plays.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
     try {
      myPlayer.reset();
      myPlayer.setDataSource(path + "/" + listFile[postion]);
      if (!myPlayer.isPlaying()) {

myPlayer.prepare();
       myPlayer.start();
      } else {
       myPlayer.pause();
      }

} catch (IOException e) {
      e.printStackTrace();
     }
    }
   });
   // 停止播放
   stop.setOnClickListener(new OnClickListener() {

@Override
    public void onClick(View arg0) {
     if (myPlayer.isPlaying()) {
      myPlayer.stop();
     }
    }
   });
   return views;
  }

}

@Override
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.start:
   final EditText filename = new EditText(this);
   Builder alerBuidler = new Builder(this);
   alerBuidler
     .setTitle("请输入要保存的文件名")
     .setView(filename)
     .setPositiveButton("确定",
       new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         String text = filename.getText().toString();
         try {
          paths = path
            + "/"
            + text
            + new SimpleDateFormat(
              "yyyyMMddHHmmss").format(System
              .currentTimeMillis())
            + ".amr";
          saveFilePath = new File(paths);
          myRecorder.setOutputFile(saveFilePath
            .getAbsolutePath());
          saveFilePath.createNewFile();
          myRecorder.prepare();
          // 开始录音
          myRecorder.start();
          start.setText("正在录音中。。");
          start.setEnabled(false);
          aler.dismiss();
          // 重新读取 文件
          File files = new File(path);
          listFile = files.list();
          // 刷新ListView
          showRecord.notifyDataSetChanged();
         } catch (Exception e) {
          e.printStackTrace();
         }

}
       });
   aler = alerBuidler.create();
   aler.setCanceledOnTouchOutside(false);
   aler.show();
   break;
  case R.id.stop:
   if (saveFilePath.exists() && saveFilePath != null) {
    myRecorder.stop();
    myRecorder.release();
    // 判断是否保存 如果不保存则删除
    new AlertDialog.Builder(this)
      .setTitle("是否保存该录音")
      .setPositiveButton("确定", null)
      .setNegativeButton("取消",
        new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog,
           int which) {
          saveFilePath.delete();
          // 重新读取 文件
          File files = new File(path);
          listFile = files.list();
          // 刷新ListView
          showRecord.notifyDataSetChanged();
         }
        }).show();

}
   start.setText("录音");
   start.setEnabled(true);
  default:
   break;
  }

}

@Override
 protected void onDestroy() {
  // 释放资源
  if (myPlayer.isPlaying()) {
   myPlayer.stop();
   myPlayer.release();
  }
  myPlayer.release();
  myRecorder.release();
  super.onDestroy();
 }

}

源码下载:http://xiazai.jb51.net/201401/yuanma/MediaRecorderTest(jb51.net).rar

Android音频录制MediaRecorder之简易的录音软件实现代码(转)的更多相关文章

  1. Android多媒体录制--MediaRecorder视频录制

    Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...

  2. Android音频输入通道的底层硬件和软件开发分析

    Android潜在的发展音频输入通道的软硬件分析 我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比較经常使用.可是也会有分开的情况,比較假设在普通的PC机中装Androi ...

  3. Android 开发 MediaRecorder音频录制

    前言 MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比 ...

  4. Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能

    Android音频处理--通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能 音频这方面很博大精深,我这里肯定讲不了什么高级的东西,最多也只是一些基础类知识,首先,我们要介绍一下 ...

  5. Android 开发 AudioRecord音频录制

    前言 Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压 ...

  6. Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据

    一.实现说明 OpenSL ES的录音要比播放简单一些,在创建好引擎后,再创建好录音接口基本就可以录音了.在这里我们做的是流式录音,所以需要用至少2个buffer来缓存录制好的PCM数据,这里我们可以 ...

  7. Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...

  8. Android音频系统之音频框架

    1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段 ...

  9. Android || IOS录制mp3语音文件方法

    Android Android Supported Media Formats : http://developer.android.com/guide/appendix/media-formats. ...

随机推荐

  1. 松软科技web教程:JavaScript HTML DOM 元素

    查找 HTML 元素 通常,通过 JavaScript,您需要操作 HTML 元素. 为了达成此目的,您需要首先找到这些元素.有好几种完成此任务的方法: 通过 id 查找 HTML 元素 通过标签名查 ...

  2. 从csv文件里取数据作为请求参数,和把返回数据放到一个csv文件

    本来想把登陆后的token放到数组里,下一个参数用,但是貌似不支持数组,暂时先这样用了,并不麻烦,还很方便. 1.添加线程组等必要的东东后,添加csv配置器 2.进行设置 说明:csv文件设置不能读取 ...

  3. 【题解】Rusty String [CF827E]

    [题解]Rusty String [CF827E] 传送门:\(\text{Rusty String}\) \(\text{[CF827E]}\) [题目描述] 多组数据,每组数据给出一个由 \(V, ...

  4. Linux动态库路径配置

    参考链接:https://blog.csdn.net/blade2001/article/details/32839937 为什么要关注动态库路径配置,是因为工作中遇到动态库依赖其他动态库,而其他动态 ...

  5. StatelessWidget 无状态组件 StatefulWidget 有状态组件 页面上绑定数据、改变页面数据

    一.Flutter 中自定义有状态组件 在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget ...

  6. pip 换源

    pip 换源 pip国内的一些镜像   阿里云 http://mirrors.aliyun.com/pypi/simple/   中国科技大学 https://pypi.mirrors.ustc.ed ...

  7. 关于 checkbox 的一些操作

    获取checkbox选中的状态 $("#checkbox").is(":checked"); 设置 checkbox 的状态 $("#checkbox ...

  8. P1149

    这题不难,我写的一个复杂度 $ O(n^2) $ 的递归算法.. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  9. 《掌握融资必备知识》---创业学习---训练营第一课---HHR---

    一,<开始学习> 1,四个思考题: (1)从你决定开始融资,到你拿到钱,你都需要经历哪些环节? (2)你知道投资机构内部的工作流程吗? (3)融资最好的时机是什么时候? (4)创投圈的专业 ...

  10. centosflask+uWSGI+nginx部署

    centosflask+uWSGI+nginx部署 1.      概念 Flask自带webserver--Werkzeug,可以搭建服务,运行网站.但在开发时,一般会用专业的--uWSGI. 另外 ...