Подтвердить что ты не робот

Пытаясь записать звук, но получая сообщение "mediarecorder ушел с необработанными событиями" и "Фатальный сигнал 11 (SIGSEGV)..."

Я пытаюсь записать аудио в android, но у меня проблема.

У меня есть кнопки запуска и остановки, "начало" для начала записи и "остановка" для остановки записи.

Проблема в том, что когда я нажимаю кнопку остановки, мое приложение регистрирует сообщение "W/MediaRecorder (635): mediarecorder ушел с необработанными событиями". (Функция запуска автоматически сохраняет аудиофайл.)

Затем, если я снова нажимаю кнопку запуска или остановки, появляется сообщение об ошибке "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();
        }

}

}

4b9b3361

Ответ 1

Я решил эту проблему, перезаписывая рекордер, прежде чем выпускать его.

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

Ответ 2

Это может возникнуть из-за запуска встроенной прошивки. SIGSEGV не может быть возможным с Java. Прочтите этот пост. В конце объясняется ошибка. Удачи.

Ошибка Android SIGSEGV при записи звука

Ответ 3

В документации указано:

Чтобы получить соответствующий обратный вызов, связанный с этими слушатели, приложения должны создавать объекты MediaRecorder на потоках с запуском Looper (основной поток пользовательского интерфейса по умолчанию уже работает Looper).

Убедитесь, что вы создали рекордер в потоке пользовательского интерфейса. Возможно, также вызовите его методы в потоке пользовательского интерфейса.

Ответ 4

У меня Android 4.0.4 (по моей неизмененной версии, Samsung внесла в нее изменения), работающий на моем Samsung Galaxy S3, и иногда я могу получить SIGSEGV ( "A/libc (20448): фатальный сигнал 11 ( SIGSEGV) при 0x00000010 (код = 1)" ), когда я использую mediarecorder.

Я также получаю SIGSEGV в своем AVD для Android 4.0, так что даже там можно получить SIGSEGV.

Теперь мне просто нужно найти то, что я делаю неправильно с mediarecorder. =)