2012-08-08 6 views
22

Próbuję nagrać audio w Androidzie, ale mam problem.Próbuję nagrać dźwięk, ale otrzymuję komunikat "mediarecorder zniknął z nieobsłużonymi zdarzeniami" i "Fatal signal 11 (SIGSEGV) ...."

Mam przyciski start i stop, "start" do rozpoczęcia nagrywania i "stop" do zatrzymania nagrywania.

Problem polega na tym, że po naciśnięciu przycisku stop, moja aplikacja rejestruje komunikat "W/MediaRecorder (635): mediarecorder zniknął z nieobsłużonymi zdarzeniami". (Funkcja Start zapisuje plik audio poprawnie.)

Następnie, jeśli ponownie naciśnij przycisk start lub stop, otrzymuję komunikat o błędzie "A/libc (743): Fatal signal 11 (SIGSEGV) at 0x00000010 (code = 1), gwint 743 (xample.recorder)”

Kod klasy zapisu poniżej:

/** 
    * 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(); 
    } 

Kod główny poniżej:

/* 
* */ 
    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(); 
     } 

} 

}

+0

to nie jest kompletny kod? Nie widzę tutaj konstruktora recorder = new MediaRecorder(); pokaż cały stacktrace, czy otrzymałeś inne wyjątki? – dimetil

+0

Użyłem tego samouczka http://www.benmccann.com/dev-blog/android-audio-recording-tutorial/ W przycisku start wywołuję funkcję start i przycisk stop Wzywam funkcję stop ... Po naciśnięciu klawisza przycisk start, naciskam stop, a następnie, gdy ponownie naciskam przycisk Start, pojawia się komunikat o błędzie "A/libc (743): sygnał krytyczny 11 (SIGSEGV) przy 0x00000010 (kod = 1), wątek 743 (xample.recorder)" – blackfyre

+0

Moja poprawka https: // stackoverflow.com/a/47992111/4592448 – Fortran

Odpowiedz

55

, że rozwiązanie tego problemu resetowania rejestrator przed zwolnieniem.

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

Cóż, to może naprawić się błąd, ale jak rozwiązać ostrzeżenie.A naprawdę, co oznacza ostrzeżenie i jak go rozwiązać? Obecnie mam ten problem –

+0

Teraz dostaję MediaRecorder stop nie powiodło się: -1007 –

+1

Dlaczego ostrzeżenie istnieje, jeśli nie " t dodaj linię 'recorder.reset();'? –

1

Może to być spowodowane uruchomionym, modowanym oprogramowaniem układowym. SIGSEGV nie powinno być możliwe z Javy. Przeczytaj ten post. Na końcu znajduje się wyjaśnienie błędu. Powodzenia.

Android SIGSEGV error when recording audio

+0

Dzięki! Czy możesz mi również powiedzieć, dlaczego nagrywa zatrzymanie przed wywołaniem funkcji stop ... Nagrywanie zatrzymuje się po kilku sekundach. :/ – blackfyre

+0

Nie rozumiem sekwencji zdarzeń. Które wydarzenie następuje po którym? Przycisk Start -> rozpoczęte nagrywanie -> zatrzymaj nagrywanie automatycznie ("kilka sekund") -> przycisk Stop? Pokaż pełne śledzenie stosu, może pomóc – dimetil

+0

Edytowałem mój wpis, a sekwencja polega na naciśnięciu przycisku nagrywania-> rozpoczęte nagrywanie-> po kilku sekundach jest zatrzymany, mimo że nie nacisnąłem przycisku zatrzymania. – blackfyre

0

mam Android 4.0.4 (an moim niezmodyfikowanej wersji, Samsung zostały wprowadzone zmiany do niego) uruchomione na moim Samsung Galaxy S3 i mogę czasami dostać SIGSEGV ("A/libc (20448): Śmiertelny sygnał 11 (SIGSEGV) przy 0x00000010 (kod = 1) "), kiedy używam nośnika.

Dostaję także SIGSEGV w moim AVD dla Androida 4.0, więc możliwe jest nawet uzyskanie SIGSEGV.

Teraz po prostu muszę znaleźć to, co robię nie tak z nośnikiem. =)

1

Dokumentacja stwierdza:

W celu otrzymania odpowiedniego zwrotnego związanego z tymi słuchaczy, aplikacje muszą tworzyć MediaRecorder obiektów na wątkach z Looper systemem (główny wątek UI domyślnie ma już uruchomiony Looper).

Upewnij się, że utworzyłeś nagrywarkę w wątku interfejsu użytkownika. Być może również wywołaj jego metody w wątku UI.

Powiązane problemy