2012-08-08 7 views
22

Ich versuche, Audio in Android aufzunehmen, aber ich stehe vor einem Problem.Der Versuch, Audio aufzunehmen, aber die Nachricht "mediarecorder kam mit unbehandelten Ereignissen weg" und "Fatal signal 11 (SIGSEGV) ...."

Ich habe Start-und Stop-Tasten, "Start" zum Starten der Aufnahme und "Stop" zum Stoppen der Aufnahme.

Das Problem ist, wenn ich die Stopp-Taste drücken, dann protokolliert meine Anwendung eine Meldung "W/MediaRecorder (635): Mediendatensatz ging mit unbehandelten Ereignissen weg". (Start Funktion ist die Audiodatei richtig zu speichern.)

Dann, wenn ich wieder Start oder Stop Taste drücke, bekomme ich die Fehlermeldung "A/libc (743): Fatal Signal 11 (SIGSEGV) bei 0x00000010 (code = 1), Gewinde 743 (xample.recorder „) ist

Code of Aufzeichnungs Klasse unter:

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

Code of Hauptaktivität ist unten:

/* 
* */ 
    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

Dies ist nicht der vollständige Code? Ich sehe den Konstruktor hier nicht recorder = new MediaRecorder(); show all stacktrace, hast du weitere Ausnahmen erhalten? – dimetil

+0

Ich habe dieses Tutorial http://www.benmccann.com/dev-blog/android-audio-recording-tutorial/ verwendet. Im Start-Button rufe ich die Funktion start auf und im Stop-Button rufe ich die Funktion stop auf ... Nach Drücken der Taste Start-Taste, ich drücke Stop und dann, wenn ich erneut die Start-Taste drücke, erhalte ich die Fehlermeldung "A/libc (743): Tödliches Signal 11 (SIGSEGV) bei 0x00000010 (Code = 1), Thread 743 (xample.recorder)" – blackfyre

+0

Mein Fix https: // stackoverflow.com/a/47992111/4592448 – Fortran

Antwort

55

löste ich dieses Problem, indem Recorder vor der Freigabe Reseting.

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

Nun, das könnte folgendes beheben up Fehler, aber wie die Warnung zu lösen ist Oder wirklich, was die Warnung bedeutet und wie man es löst? Ich habe gerade dieses Problem. –

+0

Jetzt bekomme ich MediaRecorder stop gescheitert: -1007 –

+1

Warum die Warnung existiert, wenn ich nicht ' t addiere die Zeile 'recorder.reset();'? –

1

Dies könnte durch das Ausführen von Modded Firmware entstehen. Ein SIGSEGV sollte von Java nicht möglich sein. Lesen Sie diesen Beitrag. Es gibt eine Erklärung des Fehlers am Ende. Viel Glück.

Android SIGSEGV error when recording audio

+0

Danke! Können Sie mir auch sagen, warum die Aufnahme stoppt, bevor Sie die Stop-Funktion aufrufen ... Die Aufnahme stoppt nach einigen Sekunden. :/ – blackfyre

+0

Ich verstehe die Reihenfolge der Ereignisse nicht. Welches Ereignis folgt danach? Start-Taste -> Aufnahme wird gestartet -> Aufnahme automatisch stoppen ("einige Sekunden") -> Stopp-Taste? Zeige volle Stack-Trace, kann es helfen – dimetil

+0

Ich habe meine Post und Sequenz bearbeitet ich drücke die Aufnahme-Taste-> Aufnahme gestartet-> nach ein paar Sekunden wird es gestoppt, obwohl ich nicht die Stop-Taste gedrückt habe. – blackfyre

0

Ich habe Android 4.0.4 (ein durch meine unveränderte Version von Samsung haben Änderungen vorgenommen) auf meinem Samsung Galaxy S3 läuft und ich kann manchmal eine SIGSEGV ("A/libc (20448) erhalten: Tödliches Signal 11 (SIGSEGV) bei 0x00000010 (Code = 1) ") wenn ich den Mediarecorder verwende.

Ich bekomme auch eine SIGSEGV in meinem AVD für Android 4.0, so ist es möglich, einen SIGSEGV sogar dort zu bekommen.

Jetzt muss ich nur finden, was ich falsch mit dem Mediarecorder mache. =)

1

In der Dokumentation:

Um die jeweiligen Callback mit diesen Zuhörer zugeordnet zu bekommen, sind Anwendungen erforderlich erstellen MediaRecorder auf Fäden mit einem Looper Objekte (der Haupt-UI-Thread ausgeführt wird Standardmäßig hat bereits einen Looper läuft).

Stellen Sie sicher, dass Sie den Rekorder im UI-Thread erstellen. Vielleicht rufen Sie auch seine Methoden im UI-Thread auf.

Verwandte Themen