我在做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