09-08 09:21:34.353: I/SpeexRecorder(6406): new AudioRecord():android.media.AudioRecord@429d8168
09-08 09:21:34.353: W/dalvikvm(6406): threadid=13: thread exiting with uncaught exception (group=0x40ac5210)
09-08 09:21:34.363: E/AndroidRuntime(6406): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
问题:
1、android判断是否禁用了录音权限
通过判断分贝值是否大于0,在代码中搜索 volume > 0
2、部分手机在调用 audioRecord.startRecording(); 和audioRecord.stop();方法时会抛出异常,例如联想手机
3、部分手机(例如联想)会抛出java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
解决方法来源于:http://www.cnblogs.com/mythou/p/3241925.html
原因:
出现上面问题的原因是录音的硬件资源被申请了,但是没有释放,然后你再次申请资源,导致初始化失败。这里需要注意的是不仅仅需要调用Release()方法。还需要把AudioRecord对象置为null,否则还是释放失败。下面是Android 开发网上面的一个对于AudioRecord的释放说明。
Releases the native AudioRecord resources. The object can no longer be used and the reference should be set to null after a call to release()。
解决方法在代码中:
- package com.androidleaf.audiorecord;
-
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.media.AudioFormat;
- import android.media.AudioRecord;
- import android.media.MediaRecorder;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
-
- import com.hisun.phone.core.voice.Device;
- import com.todoroo.aacenc.AACEncoder;
- import com.todoroo.aacenc.AACToM4A;
-
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.RandomAccessFile;
-
- import app.jimu.zhiyu.activity.question.AnswerActivity;
-
- public class AudioRecordUtils {
-
- private final int audioSource = MediaRecorder.AudioSource.MIC;
-
- private final int sampleRateInHz = 16000;
-
- private final int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
-
- private final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
-
- private int inBufSize = 0;
-
- private AudioRecord audioRecord;
-
- private AACEncoder encoder = null;
-
- private ProgressDialog mProgressDialog = null;
-
- private boolean isRecord = false;
-
- private Context mContext;
-
-
-
- private String mAudioRecordFileName;
-
- private static final int RECORDED_INIT_DELETE = 0;
-
- private static final int RECORDED_COMPLETED_DELETE = 1;
-
- private Handler mHandler;
-
-
-
-
- private boolean recordEnable = false;
-
- public AudioRecordUtils(Context context,String audioRecordFileName, Handler handler){
- mContext = context;
- mAudioRecordFileName = audioRecordFileName;
- mHandler = handler;
- initAudioRecord();
- }
-
-
-
-
- private void initAudioRecord(){
-
- inBufSize = AudioRecord.getMinBufferSize(
- sampleRateInHz,
- channelConfig,
- audioFormat);
-
- audioRecord = new AudioRecord(
- audioSource,
- sampleRateInHz,
- channelConfig,
- audioFormat,
- inBufSize);
-
- encoder = new AACEncoder();
- deleteAllFiles(RECORDED_INIT_DELETE);
-
- mProgressDialog = new ProgressDialog(mContext);
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(false);
- mProgressDialog.setTitle("提示");
- mProgressDialog.setMessage("正在保存录音,请耐心等候......");
-
- }
-
-
-
-
- public void startRecord(){
- new AudioRecordTask().execute();
- }
-
-
-
-
- public void pauseRecord(){
- isRecord = false;
- }
-
-
-
-
- public void stopRecord(){
- new AudioEncoderTask().execute();
- }
-
-
-
-
- public void reRecord(){
-
- deleteAllFiles(RECORDED_INIT_DELETE);
- }
-
- private void encodeAudio(){
- try {
-
- DataInputStream mDataInputStream = new DataInputStream(new FileInputStream(
- FileUtils.getPcmFilePath(mAudioRecordFileName)));
- byte[] b = new byte[(int) new File(FileUtils.
- getPcmFilePath(mAudioRecordFileName)).length()];
- mDataInputStream.read(b);
-
- encoder.init(32000, 2, sampleRateInHz, 16, FileUtils.
- getAAcFilePath(mAudioRecordFileName));
-
- encoder.encode(b);
-
- encoder.uninit();
-
- mDataInputStream.close();
- try {
-
- new AACToM4A().convert(mContext, FileUtils.getAAcFilePath(mAudioRecordFileName),
- FileUtils.getM4aFilePath(mAudioRecordFileName));
- } catch (IOException e) {
- Log.e("ERROR", "error converting", e);
- }
- deleteAllFiles(RECORDED_COMPLETED_DELETE);
- } catch (FileNotFoundException e) {
-
- e.printStackTrace();
- } catch (IOException e1) {
-
- e1.printStackTrace();
- }
- }
-
- class AudioRecordTask extends AsyncTask<Void, Void, Void>{
-
- @Override
- protected Void doInBackground(Void... params) {
-
- if(audioRecord == null){
- initAudioRecord();
- }
- RandomAccessFile mRandomAccessFile = null;
- try {
- mRandomAccessFile = new RandomAccessFile(new File(
- FileUtils.getPcmFilePath(mAudioRecordFileName)), "rw");
- byte[] b = new byte[inBufSize/4];
-
- try{
-
- audioRecord.startRecording();
- }catch (IllegalStateException e){
- e.printStackTrace();
- }
-
-
- isRecord = true;
- long wait = 0;
- long maxWait = 10;
- while(isRecord){
-
- int r = audioRecord.read(b, 0, b.length);
- long v = 0;
-
- for (int i = 0; i < b.length; i++) {
- v += b[i] * b[i];
- }
-
- double mean = v / (double) r;
- double volume = 10 * Math.log10(mean);
-
- wait++;
- if(wait > maxWait){
- wait = 0;
- Log.d(this.getClass().getName(), "分贝值:" + volume + " " + (volume > 0));
- if(volume > 0){
- recordEnable = true;
- }
- Message msg = new Message();
- msg.what = AnswerActivity.STATUS_PREPARE;
- Bundle bundle = new Bundle();
- bundle.putDouble(Device.VOICE_AMPLITUDE, volume);
- msg.obj = bundle;
- mHandler.sendMessage(msg);
- }
-
-
- mRandomAccessFile.seek(mRandomAccessFile.length());
- mRandomAccessFile.write(b, 0, b.length);
- }
-
- try {
-
- audioRecord.stop();
-
- audioRecord.release();
- audioRecord = null;
- }catch (IllegalStateException e){
- e.printStackTrace();
- }
- mRandomAccessFile.close();
- } catch (FileNotFoundException e) {
-
- e.printStackTrace();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- return null;
- }
- }
-
- class AudioEncoderTask extends AsyncTask<Void, Void, Long>{
-
- @Override
- protected void onPreExecute() {
-
- super.onPreExecute();
- if(mProgressDialog != null && !mProgressDialog.isShowing()){
-
- Message msg = new Message();
- msg.what = 2;
- mHandler.sendMessage(msg);
- }
- }
-
- @Override
- protected Long doInBackground(Void... params) {
-
- encodeAudio();
- return null;
- }
-
- @Override
- protected void onPostExecute(Long result) {
-
- super.onPostExecute(result);
- if(mProgressDialog.isShowing()){
- mProgressDialog.cancel();
- mProgressDialog.dismiss();
- }
- }
- }
-
-
-
-
-
- public void deleteAllFiles(int isRecorded){
- File[] files = new File(FileUtils.getAudioRecordFilePath()).listFiles();
- switch (isRecorded) {
- case RECORDED_INIT_DELETE:
- for(File file: files){
- file.delete();
- }
- break;
- case RECORDED_COMPLETED_DELETE:
- for(File file: files){
- if(!file.getName().equals(mAudioRecordFileName + Constants.M4A_SUFFIX)){
- file.delete();
- }
- }
- break;
- default:
- break;
- }
- }
-
- public boolean isRecordEnable() {
- return recordEnable;
- }
- }