mediaRecorder 报错stop called in an invalid state:1

mizaru 2015-06-04 03:17:13
我在做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>
...全文
1856 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
M_O_ 2015-06-05
  • 打赏
  • 举报
回复 2
因为点击一次按钮,就会触发ontouch两次,一次down,一次up
mizaru 2015-06-04
  • 打赏
  • 举报
回复
谢谢指点。。我把多余的mr=new MediaRecorder();去掉,app只建一次 MediaRecorder,但依然报错 。于是我把界面改成了两个按钮,一个 开始录音,一个 结束录音 。。把一个onTOonClauchListener改成两个onClick( ),然后问题就解决了。。。虽然问题解决了。但还是搞不懂问题出在哪里。。。究竟哪里出了问题????为什么用onTouch就会报错? 以下是修改后的源码 recordStop(View v)和 recordStart(View v)分别是按下 开始录音(按下 录音 按钮时调用),和 结束录音(按下 “结束录音” 按钮 时调用)的方法。。 package com.example.english; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; import com.example.start.Global; import com.example.start.MyComparator; import android.app.Activity; import android.database.Cursor; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; public class chatting extends Activity{ private ListView mListView; public static ArrayList<Map<String,Object>> chatList= new ArrayList<Map<String,Object>>(); public static MediaRecorder mr; public void recordStart() throws IllegalStateException, IOException{ 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+"fiss.3gp"); mr.prepare(); mr.start(); Log.i("Record","Record Start"); } public void recordStart(View v){ try{ if(mr==null){mr=new MediaRecorder();Log.i("media","MediaRecorder is created");} // 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+"fiss.3gp"); mr.prepare(); mr.start(); Log.i("Record","Record Start"); }catch(Exception e){Log.i("111","222");} } public void recordStop(View v) throws IllegalStateException{ Log.i("Record","Rcord Finish1"); // mr.wait(); mr.stop(); mr.release(); mr=null; Log.i("Record","Rcord Finish2"); } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //new一个ListView setContentView(R.layout.dialogwindow2); //set audio recorder // Button btnRecord=(Button)findViewById(R.id.Record); Button btnRecordstop=(Button)findViewById(R.id.recordStop); /* 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+"fiss.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; } } ); */ Log.v("chatting class","ctl"); mListView = new ListView(this); mListView=(ListView)findViewById(R.id.chatting_history_lv); //take the students cursor data out Cursor Cchat=Global.Chatting_c; Cchat.moveToFirst(); //Log.v("chatting class","ctl2"); int E=10; chatList.clear(); //must add this clear() method.because chatList is static , //if this method is not added,the map added into list would be accumulated. for (Cchat.moveToFirst(); !Cchat.isAfterLast();Cchat.moveToNext()) { Map<String,Object> item = new HashMap<String,Object>(); Log.v("chatting class","ct3"); item.put("RemoteId",Cchat.getString(0)); //String Lcid=Cchat.getString(1); item.put("LocalId", Cchat.getString(1)); // String Rmad=Cchat.getString(2); item.put("RemoteAudio", Cchat.getString(2)); // String Lcad=Cchat.getString(3); item.put("LocalAudio", Cchat.getString(3)); // String Rmimg=Cchat.getString(4); item.put("RemoteImage", Cchat.getString(4)); // String Lcimg=Cchat.getString(5); item.put("LocalImage", Cchat.getString(5)); // String Rmsay=Cchat.getString(6); item.put("RemoteSay",Cchat.getString(6)); // String Lcsay=Cchat.getString(7); item.put("LocalSay",Cchat.getString(7)); // String Msgtype=Cchat.getString(8); item.put("MessageType",Cchat.getString(8)); item.put("Time", Cchat.getString(9)); Log.v("Time",Cchat.getString(9)); this.chatList.add(item); } //now sort by time MyComparator myComparator=new MyComparator(); Collections.sort(chatList,myComparator); //定义一个SimpleAdapter chatListAdapter adapter = new chatListAdapter(this, this.chatList); Log.v("vvvvv","vvvvv"); mListView.setAdapter(adapter); Log.v("chatList clear","chatList Clear,Chatting cusor close"); } }
liudashao0 2015-06-04
  • 打赏
  • 举报
回复
你需要按照官方给定的顺序来编写代码!http://www.android-doc.com/guide/topics/media/audio-capture.html
M_O_ 2015-06-04
  • 打赏
  • 举报
回复
看到你创建了两次mediarecorder,需要这样吗

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧