尝试录制音频但收到消息“mediarecorder因未处理事件而消失”和“致命信号11(SIGSEGV)……”

我试图在Android中录制音频,但我遇到了问题。

我有启动和停止按钮,“开始”开始录音,“停止”停止录音。

问题是,当我按下停止按钮时,我的应用程序会记录一条消息“W / MediaRecorder(635):mediarecorder因未处理的事件而消失”。 (启动function正确保存音频文件。)

然后,如果我再次按下开始或停止按钮,那么我得到错误消息“A / libc(743):致命信号11(SIGSEGV)在0x00000010(代码= 1),线程743(xample.recorder)”

录音类代码如下:

/** * Creates a new audio recording at the given path (relative to root of SD card). */ public AudioRecorder(String path) { this.path = sanitizePath(path); } private String sanitizePath(String path) { if (!path.startsWith("/")) { path = "/" + path; } if (!path.contains(".")) { path += ".3gp"; } return Environment.getExternalStorageDirectory().getAbsolutePath() + path; } public void start() throws IOException { String state = android.os.Environment.getExternalStorageState(); if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) { throw new IOException("SD Card is not mounted. It is " + state + "."); } // make sure the directory we plan to store the recording in exists File directory = new File(path).getParentFile(); if (!directory.exists() && !directory.mkdirs()) { throw new IOException("Path to file could not be created."); } recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(path); try{ recorder.prepare(); } catch(IOException e){ Log.e("Recorder","Recording failed"); } recorder.start(); } /** * Stops a recording that has been previously started. */ public void stop() throws IOException { recorder.stop(); recorder.release(); } 

主要活动代码如下:

  /* * */ public class Recorder extends Activity implements OnClickListener { private static final String TAG="Recorder"; AudioRecorder ar=new AudioRecorder("/TestAudio.3gp"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recorder); final Button start = (Button) this.findViewById(R.id.btn_start); start.setOnClickListener(this); final Button stop = (Button) this.findViewById(R.id.btn_stop); stop.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_recorder, menu); return true; } public void onClick(View v) { // TODO Auto-generated method stub try{ switch (v.getId()) { case R.id.btn_start: ar.start(); Log.d("Recorder","Recorded"); Toast.makeText(this, "Controll returned from start function", Toast.LENGTH_LONG).show(); break; case R.id.btn_stop: ar.stop(); Toast.makeText(this, "Recording stopped; Starting MediaPlayer", Toast.LENGTH_SHORT).show(); //Toast.makeText(this, "Starting media player", Toast.LENGTH_LONG).show(); ar.startPlaying(); //Toast.makeText(this, "Recording stopped", Toast.LENGTH_LONG).show(); break; } } catch(Exception e){ Log.e("Recorder", e.getMessage(), e); Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } } 

}

我在释放之前通过重置录音机解决了这个问题。

 recorder.stop(); // stop recording recorder.reset(); // set state to idle recorder.release(); // release resources back to the system recorder = null; 

这可能是由于运行修改的固件而引起的。 Java中不应该有SIGSEGV。 阅读这篇文章。 最后有一个错误的解释。 祝你好运。

录制音频时出现Android SIGSEGV错误

文件说明:

为了接收与这些侦听器关联的相应回调,应用程序需要在运行Looper的线程上创建MediaRecorder对象 (默认情况下,主UI线程已经运行了Looper)。

确保在UI线程上创建记录器。 也许还可以在UI线程上调用它的方法。

我有三星Galaxy S3上运行的Android 4.0.4(我的未修改版本,三星已对其进行了更改)我有时会得到一个SIGSEGV(“A / libc(20448):致命信号11(SIGSEGV)at at 0x00000010(code = 1)“)当我使用mediarecorder时。

我也在我的AVD for Android 4.0中得到了一个SIGSEGV,所以即使在那里也可以得到一个SIGSEGV。

现在我只需要find我对mediarecorder的错误。 =)