Android录音播放管理工具

1、语音播放直接用系统工具就好了,这个就不多说了,根据传入的路径(网络路径或本地路径均可)播放音频文件

/**
 * Created by zhb on 2017/1/16.
 * 音乐在线播放
 */

public class PlayManager {
 private Context mcontext;
 public PlayManager(Context context){
  this.mcontext = context;
 }

 public void play(String song){
  MediaPlayer mp = new MediaPlayer();
  try {
//   存储在SD卡或其他文件路径下的媒体文件
//   例如:mp.setDataSource("/sdcard/test.mp3");
//   网络上的媒体文件
//   例如:mp.setDataSource("http://www...../music/test.mp3");
   mp.setDataSource(song);
   mp.prepare();
   mp.start();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

2.录制amr格式音频文件(微信语音便用的这种格式,至于音频文件格式之间的比较请自行百度)

/**
 * Created by zhb on 2017/1/16.
 * 本地录音
 */

public class RecordManager {
 //录制成amr格式............................................................
 private Context mcontext;
 MediaRecorder mediaRecorder ;

 public RecordManager(Context context){
  this.mcontext = context;
  //TODO 初始化安装路径,录音流程
 }

 /**开始录制*/
 public void start_amr(){
  mediaRecorder = new MediaRecorder();
  /**
   * mediaRecorder.setAudioSource设置声音来源。
   * MediaRecorder.AudioSource这个内部类详细的介绍了声音来源。
   * 该类中有许多音频来源,不过最主要使用的还是手机上的麦克风,MediaRecorder.AudioSource.MIC
   */
  mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  /**
   * mediaRecorder.setOutputFormat代表输出文件的格式。该语句必须在setAudioSource之后,在prepare之前。
   * OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等。
   */
  mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
  /**
   * mediaRecorder.setAddioEncoder()方法可以设置音频的编码
   * AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB
   */
  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  /**
   * 设置录音之后,保存音频文件的位置,一般是SD卡的位置
   */
  mediaRecorder.setOutputFile(String.valueOf(PathManger.getVoicePath()));

  /**
   * 调用start开始录音之前,一定要调用prepare方法。
   */
  try {
   mediaRecorder.prepare();
   mediaRecorder.start();
  }
  catch (IllegalStateException e) {
   e.printStackTrace();
  }
  catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**停止录音*/
 public void stop_amr(){
  mediaRecorder.stop();
  mediaRecorder.release();
  mediaRecorder = null;
 }

 /**重置录音*/
 public void reset_amr(){
  mediaRecorder.reset();
 }

}

3、配置转换工具包(这个比较简单,配置以下文件即可)

添加flame.jar,并在armeabi和armeabi-v7a文件夹添加libmp3lame.so
资源文件:http://xiazai.jb51.net/201701/yuanma/androidlibmp3lame(jb51.net).rar

4、录制MP3格式音频文件(个人觉得这种格式能比较好的统一Android端和iOS端的音频文件,虽然方法相对比较繁杂一些)

/**
 * Created by zhb on 2017/1/16.
 * 本地录音
 */
public class RecordManager {
 //录制成MP3格式..............................................
 /**构造时候需要的Activity,主要用于获取文件夹的路径*/
 private Activity activity;

 /**文件代号*/
 public static final int RAW = 0X00000001;
 public static final int MP3 = 0X00000002;

 /**文件路径*/
 private String rawPath = null;
 private String mp3Path = null;

 /**采样频率*/
 private static final int SAMPLE_RATE = 11025;

 /**录音需要的一些变量*/
 private short[] mBuffer;
 private AudioRecord mRecorder;

 /**录音状态*/
 private boolean isRecording = false;
 /**是否转换ok*/
 private boolean convertOk = false;

 public RecordManager(Activity activity, String rawPath, String mp3Path) {
  this.activity = activity;
  this.rawPath = rawPath;
  this.mp3Path = mp3Path;
 }

 /**开始录音*/
 public boolean start_mp3() {
  // 如果正在录音,则返回
  if (isRecording) {
   return isRecording;
  }
  // 初始化
  if (mRecorder == null) {
   initRecorder();
  }

  getFilePath();
  mRecorder.startRecording();
  startBufferedWrite(new File(rawPath));

  isRecording = true;
  return isRecording;
 }

 /**停止录音,并且转换文件,这很可能是个耗时操作,建议在后台中做*/
 public boolean stop_mp3() {
  if (!isRecording) {
   return isRecording;
  }

  // 停止
  mRecorder.stop();
  isRecording = false;
//TODO
  // 开始转换
  FLameUtils lameUtils = new FLameUtils(1, SAMPLE_RATE, 96);
  convertOk = lameUtils.raw2mp3(rawPath, mp3Path);

  return isRecording ^ convertOk;// convertOk==true,return true
 }

 /**获取文件的路径*/
 public String getFilePath(int fileAlias) {
  if (fileAlias == RAW) {
   return rawPath;
  } else if (fileAlias == MP3) {
   return mp3Path;
  } else
   return null;
 }

 /**清理文件*/
 public void cleanFile(int cleanFlag) {
  File f = null;
  try {
   switch (cleanFlag) {
    case MP3:
     f = new File(mp3Path);
     if (f.exists())
      f.delete();
     break;
    case RAW:
     f = new File(rawPath);
     if (f.exists())
      f.delete();
     break;
    case RAW | MP3:
     f = new File(rawPath);
     if (f.exists())
      f.delete();
     f = new File(mp3Path);
     if (f.exists())
      f.delete();
     break;
   }
   f = null;
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**关闭,可以先调用cleanFile来清理文件*/
 public void close() {
  if (mRecorder != null)
   mRecorder.release();
  activity = null;
 }

 /**初始化*/
 private void initRecorder() {
  int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
  mBuffer = new short[bufferSize];
  mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
    bufferSize);
 }

 /**设置路径,第一个为raw文件,第二个为mp3文件*/
 private void getFilePath() {
  try {
   String folder = "audio_recorder_2_mp3";
   String fileName = String.valueOf(System.currentTimeMillis());
   if (rawPath == null) {
    File raw = new File(activity.getDir(folder,
      activity.MODE_PRIVATE), fileName + ".raw");
    raw.createNewFile();
    rawPath = raw.getAbsolutePath();
    raw = null;
   }
   if (mp3Path == null) {
    File mp3 = new File(activity.getDir(folder,
      activity.MODE_PRIVATE), fileName + ".mp3");
    mp3.createNewFile();
    mp3Path = mp3.getAbsolutePath();
    mp3 = null;
   }

   Log.d("rawPath", rawPath);
   Log.d("mp3Path", mp3Path);

   runCommand("chmod 777 " + rawPath);
   runCommand("chmod 777 " + mp3Path);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**执行cmd命令,并等待结果*/
 private boolean runCommand(String command) {
  boolean ret = false;
  Process process = null;
  try {
   process = Runtime.getRuntime().exec(command);
   process.waitFor();
   ret = true;
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    process.destroy();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return ret;
 }

 /**写入到raw文件*/
 private void startBufferedWrite(final File file) {
  new Thread(new Runnable() {
   @Override
   public void run() {
    DataOutputStream output = null;
    try {
     output = new DataOutputStream(new BufferedOutputStream(
       new FileOutputStream(file)));
     while (isRecording) {
      int readSize = mRecorder.read(mBuffer, 0,
        mBuffer.length);
      for (int i = 0; i < readSize; i++) {
       output.writeShort(mBuffer[i]);
      }
     }
    } catch (IOException e) {
     e.printStackTrace();
    } finally {
     if (output != null) {
      try {
       output.flush();
      } catch (IOException e) {
       e.printStackTrace();

      } finally {
       try {
        output.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
     }
    }
   }
  }).start();
 }
}

5、最后在自己想调用的地方调用就好了,PathManger这个是我自己的路径管理工具,这里不贴了,反正自己直接放一个路径字符串进去就好了

/**初始化语音*/
 private void initVoice() {
 //录音
 RecordManager = new RecordManager(
  CallHelpActivity.this,
  String.valueOf(PathManger.getVoicePathToRaw()),
  String.valueOf(PathManger.getVoicePathToMp3()));
 callHelp_Voice_longclick.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
  switch(event.getAction()){
   case MotionEvent.ACTION_DOWN:
   RecordManager.start_mp3();
   break;
   case MotionEvent.ACTION_MOVE:

   break;
   case MotionEvent.ACTION_UP:
   RecordManager.stop_mp3();
   break;
  }
  return false;
  }
 });
 //语音播放
 final PlayManager PlayManager = new PlayManager(this);
 callHelp_Voice_click.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  PlayManager.play(String.valueOf(PathManger.getVoicePathToMp3()));
  }
 });
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

     Android 录音与播放功能的简单实例 最近在研究Android中一些常用的功能,像地图.拍照.录音和播放的实现等等,还有一些侧滑.动画等是如何实现的. 今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部的类即可实现. 1.先看下运行后的界面: 以下三张图分别是进入.录音.播放时的. 2.Layout布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

  • Android实现自制和播放录音程序

    首先,让我们先看下实现的截图: 当有录音文件存在时,会显示在下面的ListView当中. 下面给出实现的完整代码: 1.主程序代码 package irdc.ex07_11; import java.io.File; import java.io.IOException; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.media.Medi

  • Android使用MediaRecorder实现录音及播放

    现在项目中有使用到音视频相关技术,在参考了网上各种大牛的资料及根据自己项目实际情况(兼容安卓6.0以上版本动态权限管理等),把声音录制及播放相关代码做个记录. public class MediaRecorderActivity extends BaseActivity { private Button start_tv; private ListView listView; //线程操作 private ExecutorService mExecutorService; //录音API pri

  • Android编程开发录音和播放录音简单示例

    本文实例讲述了Android编程开发录音和播放录音的方法.分享给大家供大家参考,具体如下: /* * The application needs to have the permission to write to external storage * if the output file is written to the external storage, and also the * permission to record audio. These permissions must be

  • Android录音播放管理工具

    1.语音播放直接用系统工具就好了,这个就不多说了,根据传入的路径(网络路径或本地路径均可)播放音频文件 /** * Created by zhb on 2017/1/16. * 音乐在线播放 */ public class PlayManager { private Context mcontext; public PlayManager(Context context){ this.mcontext = context; } public void play(String song){ Med

  • Android录音mp3格式实例详解

    Android录音支持的格式有amr.aac,但这两种音频格式在跨平台上表现并不好. MP3显然才是跨平台的最佳选择. 项目地址 GavinCT/AndroidMP3Recorder 实现思路概述 在分析代码前,我们需要明确几个问题 1. 如何最终生成MP3 实现MP3格式最好是借助Lame这个成熟的解决方案. 对于Android来说,需要借助JNI来调用Lame的C语言代码,实现音频格式的转化. 2. 如何获取最初的音频数据 AudioRecord类可以直接帮助我们获取音频数据. 3. 如何进

  • Android开发之Activity管理工具类完整示例

    本文实例讲述了Android开发之Activity管理工具类.分享给大家供大家参考,具体如下: 这个工具类是对Activity的一些管理,非常适用 package com.maobang.imsdk.util; import java.util.Stack; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.graphics

  • Android相机管理工具类

    本文实例为大家分享了Android相机管理工具类的具体代码,供大家参考,具体内容如下 package com.utils.tools; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import com.shennongshi.dingdong.R; import com.shennongshi.dingdong.pztools.IntentConstant.R

  • Android手机管理工具类详解

    Android手机管理工具类 AppPhoneMgr分享给大家,供大家参考,具体内容如下 工具类内的方法: getInstance          : 单例对象 getSDKVersionNumber  : 获取手机系统版本号 getPhoneModel        : 获取手机型号 getPhoneWidth        : 获取手机宽度 getPhoneHeight       : 获取手机高度 getPhoneImei         : 获取手机imei串号 ,GSM手机的 IME

  • Android源代码仓库及其管理工具Repo分析详解

    软件工程由于需要不断迭代开发,因此要对源代码进行版本管理.Android源代码工程(AOSP)也不例外,它采用Git来进行版本管理.AOSP作为一个大型开放源代码工程,由许许多多子项目组成,因此不能简单地用Git进行管理,它在Git的基础上建立了一套自己的代码仓库,并且使用工具Repo进行管理.工欲善其事,必先利其器.本文就对AOSP代码仓库及其管理工具repo进行分析,以便提高我们日常开发效率. <Android系统源代码情景分析>--点击下载 现代的代码版本管理工具,SVN和Git是最流行

  • Android开发实现的内存管理工具类

    本文实例讲述了Android开发实现的内存管理工具类.分享给大家供大家参考,具体如下: /*********************************************** * 内存管理工具 * * @author chen.lin * @version 1.0 ************************************************/ public class MemoryManager { private static final String TAG =

  • Android如何判断手机是否有录音权限的工具类

    作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android7.1的系统. 记得在清单文件中配置对应的权限. 思路 检测是否有权限 -->有权限--执行相关操作 -->无权限-- 判断系统版本 --大于等于6.0 --动态申请权限 -->对申请结果的回调处理 --允许 --拒绝 代码 工具类CheckAudioPermission.java pack

  • Android音频焦点管理实例详解

    目录 音频焦点管理的意义 音频焦点管理的行为准则 版本兼容 在Android 8.0(API 26) 之前对音频焦点具体处理实现 8.0 之后实现 延迟获取焦点 自动降低音量 音频焦点请求方式 响应音频焦点更改 暂时性失去焦点 永久性失去焦点 附音频基础知识 总结 音频焦点管理的意义 两个或两个以上的 Android 应用可同时向同一输出流播放音频.系统会将所有音频流混合在一起.虽然这是一项出色的技术,但却会给用户带来很大的困扰.为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的

  • Android录音应用实例教程

    本文以实例形式较为详细的展示了Android录音的实现方法,分享给大家供大家参考之用.具体方法如下: 首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" andr

随机推荐