当前位置: 代码迷 >> Android >> mediaRecorder 出错stop called in an invalid state:1
  详细解决方案

mediaRecorder 出错stop called in an invalid state:1

热度:251   发布时间:2016-04-28 00:33:36.0
mediaRecorder 报错stop called in an invalid state:1
我在做android 开发,大概是做一个聊天软件。其中有个 语音聊天功能。操作和  微信 聊天界面差不多。
大概是设置一个button,然后 按下(onTouch)的时候录音,松开 则保存及发送录音。

今天我用mediaRecord写了这个功能。但奇怪的事情发生了。
当我按下 按钮时,能正常录音,但当我松开按钮,调用 mediaRecorder. stop()时,却发生如下exception
---stop called in an invalid state:1

网上查了很久,墙内外都搜过。
答案无外乎以下几种

1.没有设置好权限,但实际上,我已经设置好了 读写sd card的permission 和 录音的 permissiom,应该不存在权限的问题。

2.调用 stop()之前,MediaRecorder的状态不是 prepare ,或没有先调用 start()。但我是严格按照google文档所描述的程序进行录音的。之前已经调用了reset().   prepare(),然后调用start(),最后才调用 stop()。

3.录音的时间太短。应该不存在这个可能性,因为我录了100多秒都还是有同样的报错。

。。
最奇怪的是,尽管系统报错,程序自动退出,但我查了一个sd card,实际上已经生成了我想要的录音文件。
更奇怪的是,这个录音文件有时是有声音,而有时却是一个空的没声音的音频文档。。

以下是我的代码,烦请协助研究一下问题出在何处。
public class MainActivity extends ActionBarActivity {
public MediaRecorder mr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnRecord=(Button)findViewById(R.id.record);

btnRecord.setOnTouchListener(new View.OnTouchListener() {
         @Override
public boolean onTouch(View v, MotionEvent mv) {

    if(mr==null){mr=new MediaRecorder();Log.i("EE","build new med obj");}
    //must new a MediaRecorder object .or it would occur a NullPoint
mr.reset();
if(mv.getAction()==MotionEvent.ACTION_DOWN){
try{
mr=new MediaRecorder();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mr.setMaxDuration(10000);
mr.setOutputFile(Environment.getExternalStorageDirectory().getPath()+File.separator+"fisii77s.3gp");
mr.prepare();
mr.start();
Log.i("Record","Record Start");


//recordStart();
return false;
}catch(Exception e){Log.e("Record","RRE"+e.toString());return true;}
     
}
if(mv.getAction()==MotionEvent.ACTION_UP){
   if(mr!=null){
  Log.i("111","1112");
     mr.stop();
     mr.release();
return true;
   
   }else{Log.i("NUll","mr is null");

};

}
return false;
}
}
);


}
}


-------下面是manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="1"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
    
    
    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    

</manifest>
------解决思路----------------------
你需要按照官方给定的顺序来编写代码!http://www.android-doc.com/guide/topics/media/audio-capture.html
------解决思路----------------------
因为点击一次按钮,就会触发ontouch两次,一次down,一次up
  相关解决方案